news 2026/7/5 21:04:02

华为OD机考双机位C卷 - 完全二叉树非叶子部分后序遍历 (Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 完全二叉树非叶子部分后序遍历 (Java Python JS C/C++ GO )

最新华为上机考试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
华为OD机考双机位C卷 - 完全二叉树非叶子部分后序遍历

题目描述

给定一个以顺序储存结构存储整数值的完全二叉树序列(最多1000个整数),请找出此完全二叉树的所有非叶子节点部分,然后采用后序遍历方式将此部分树(不包含叶子)输出。

1、只有一个节点的树,此节点认定为根节点(非叶子)。

2、此完全二叉树并非满二叉树,可能存在倒数第二层出现叶子或者无右叶子的情况

其他说明:二叉树的后序遍历是基于根来说的,遍历顺序为:左-右-根

输入描述

一个通过空格分割的整数序列字符串

输出描述

非叶子部分树结构。备注:输出数字以空格分隔

示例1

输入

1 2 3 4 5 6 7

输出

2 3 1

说明

找到非叶子部分树结构,然后采用后序遍历输出。

解题思路

  1. 完全二叉树的数组表示:完全二叉树可以通过数组形式表示,其中父节点和子节点的关系通过索引确定:

    • 对于数组中的任一节点,其在数组中的索引为 ( i ):
      • 左子节点的索引为 ( 2i + 1 )
      • 右子节点的索引为 ( 2i + 2 )
    • 反过来,任意节点的父节点索引可以通过 ( \frac{i-1}{2} ) 计算(向下取整)。
  2. 非叶子节点的确定:在完全二叉树中,只要节点至少有一个子节点,它就是一个非叶子节点。最后一个非叶子节点是最后一个节点的父节点。

  3. 后序遍历的要求:后序遍历的顺序是先访问左子树,然后访问右子树,最后访问根节点。对于非叶子节点的子树,也需要按照这一顺序遍历。

  4. 特殊情况

    • 单节点树:如果树中只有一个节点,该节点同时是根节点和非叶子节点,直接输出。
    • 非满二叉树:在倒数第二层可能有叶子节点的情况,意味着最后一个节点可能没有子节点或只有一个子节点。

Java

importjava.util.*;importjava.io.*;publicclassMain{// 后序遍历函数publicstaticvoidpostorderTraversal(List<Integer>tree,introot,List<Integer>res){intleft=root*2+1;// 左子节点的索引intright=root*2+2;// 右子节点的索引if(left<tree.size()){// 如果左子节点存在postorderTraversal(tree,left,res);// 递归遍历左子树}if(right<tree.size()){// 如果右子节点存在postorderTraversal(tree,right,res);// 递归遍历右子树}if(left<tree.size()||right<tree.size()){// 只有当当前节点有子节点时才是非叶子节点res.add(tree.get(root));// 将非叶子根节点加入结果数组}}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringinput=sc.nextLine();// 读入一行数据String[]nums=input.split(" ");List<Integer>tree=newArrayList<>();for(Stringnum:nums){// 逐个读入数字tree.add(Integer.parseInt(num));// 将数字加入树的数组中}if(tree.size()==1){// 只有一个节点的情况System.out.println(tree.get(0));// 直接输出该节点return;}List<Integer>res=newArrayList<>();postorderTraversal(tree,0,res);// 后序遍历StringBuildersj=newStringBuilder();for(inti=0;i<res.size();i++){// 将结果数组转换为字符串sj.append(res.get(i));if(i!=res.size()-1)sj.append(" ");}System.out.println(sj.toString());// 输出结果字符串}}

Python

defpostorder_traversal(tree,root,res):# 计算左右子节点的索引left=root*2+1right=root*2+2# 如果左子节点存在,递归遍历左子树ifleft<len(tree):postorder_traversal(tree,left,res)# 如果右子节点存在,递归遍历右子树ifright<len(tree):postorder_traversal(tree,right,res)# 判断当前节点是否为非叶子节点ifleft<len(tree)orright<len(tree):res.append(tree[root])defmain():# 读取输入的整数序列tree=list(map(int,input().split()))iflen(tree)==1:# 如果只有一个节点print(tree[0])returnres=[]postorder_traversal(tree,0,res)# 后序遍历print(" ".join(map(str,res)))if__name__=="__main__":main()

JavaScript

functionpostorderTraversal(tree,root,res){constleft=root*2+1;// 左子节点索引constright=root*2+2;// 右子节点索引// 递归遍历左右子树if(left<tree.length)postorderTraversal(tree,left,res);if(right<tree.length)postorderTraversal(tree,right,res);// 只有非叶子节点才加入结果if(left<tree.length||right<tree.length)res.push(tree[root]);}constreadline=require('readline').createInterface({input:process.stdin,output:process.stdout});readline.on('line',input=>{consttree=input.split(' ').map(Number);if(tree.length===1){console.log(tree[0]);return;}constres=[];postorderTraversal(tree,0,res);console.log(res.join(' '));readline.close();});

C++

#include<iostream>#include<vector>#include<string>#include<sstream>using namespace std;voidpostorderTraversal(constvector<int>&tree,introot,vector<int>&res){intleft=root*2+1;intright=root*2+2;// 递归左右子树if(left<tree.size())postorderTraversal(tree,left,res);if(right<tree.size())postorderTraversal(tree,right,res);if(left<tree.size()||right<tree.size())res.push_back(tree[root]);}intmain(){string input;getline(cin,input);istringstreamiss(input);vector<int>tree;intnum;while(iss>>num)tree.push_back(num);if(tree.size()==1){cout<<tree[0]<<endl;return0;}vector<int>res;postorderTraversal(tree,0,res);for(inti=0;i<res.size();i++){cout<<res[i]<<(i<res.size()-1?" ":"");}cout<<endl;return0;}

Go

packagemainimport("bufio""fmt""os""strconv""strings")// 后序遍历函数funcpostorderTraversal(tree[]int,rootint,res*[]int){left:=root*2+1// 左子节点的索引right:=root*2+2// 右子节点的索引ifleft<len(tree){// 如果左子节点存在postorderTraversal(tree,left,res)// 递归遍历左子树}ifright<len(tree){// 如果右子节点存在postorderTraversal(tree,right,res)// 递归遍历右子树}ifleft<len(tree)||right<len(tree){// 只有当当前节点有子节点时才是非叶子节点*res=append(*res,tree[root])// 将非叶子根节点加入结果数组}}funcmain(){scanner:=bufio.NewScanner(os.Stdin)scanner.Scan()input:=scanner.Text()// 读入一行数据nums:=strings.Split(input," ")tree:=make([]int,0,len(nums))for_,numStr:=rangenums{// 逐个读入数字num,_:=strconv.Atoi(numStr)tree=append(tree,num)// 将数字加入树的数组中}iflen(tree)==1{// 只有一个节点的情况fmt.Println(tree[0])// 直接输出该节点return}res:=make([]int,0)postorderTraversal(tree,0,&res)// 后序遍历sb:=strings.Builder{}fori:=0;i<len(res);i++{// 将结果数组转换为字符串sb.WriteString(strconv.Itoa(res[i]))ifi!=len(res)-1{sb.WriteString(" ")}}fmt.Println(sb.String())// 输出结果字符串}

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>voidpostorderTraversal(int*tree,introot,intsize,int*res,int*index){intleft=root*2+1;intright=root*2+2;// 递归遍历子树if(left<size)postorderTraversal(tree,left,size,res,index);if(right<size)postorderTraversal(tree,right,size,res,index);if(left<size||right<size)res[(*index)++]=tree[root];}intmain(){charinput[4000];fgets(input,4000,stdin);int*tree=malloc(1000*sizeof(int));intsize=0;char*token=strtok(input," ");while(token){tree[size++]=atoi(token);token=strtok(NULL," ");}if(size==1){printf("%d\n",tree[0]);free(tree);return0;}int*res=malloc(size*sizeof(int));intindex=0;postorderTraversal(tree,0,size,res,&index);for(inti=0;i<index;i++){printf("%d%c",res[i],i<index-1?' ':'\n');}free(tree);free(res);return0;}

完整用例

用例1

50 30 70 20 40 60

用例2

1 2 3 4 5 6 7 8 9 10 11

用例3

1 2 3 4 5 6 7 8 9 10 11 12 13 14

用例4

10 20 30 40 50 60 70

用例5

1 2 3 4 5 6 7 8

用例6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

用例7

1 2 4 8

用例8

1

用例9

1 2 3 4 5 6 7 8 9 10 11 12 13 14

用例10

1 2

文章目录

  • 最新华为上机考试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 13:58:51

强烈安利9个一键生成论文工具,MBA论文写作必备!

强烈安利9个一键生成论文工具&#xff0c;MBA论文写作必备&#xff01; AI 工具如何成为 MBA 学习的得力助手 MBA 学习过程中&#xff0c;论文写作是一项重要且繁重的任务。随着 AI 技术的不断进步&#xff0c;越来越多的 AI 工具被引入到学术研究和论文撰写中。这些工具不仅能…

作者头像 李华
网站建设 2026/6/30 21:15:34

外贸黄金时代,这5款高效应用能让你的业务赢在起跑线上!

在全球化浪潮中&#xff0c;外贸早已不再是大型企业的专属战场&#xff0c;越来越多的中小微企业正扬帆出海。然而&#xff0c;出海的航道充满挑战&#xff1a;时差导致商机在深夜溜走&#xff0c;陌生的国际长途号码让客户拒接&#xff0c;散落在邮件、Excel里的客户信息让管理…

作者头像 李华
网站建设 2026/7/3 1:07:21

原创大规模无人机检测数据集:11998张高质量图像,支持YOLOv8、COCO、TensorFlow多格式训练,涵盖飞机、无人机、直升机三大目标类别

大规模无人机检测数据集&#xff1a;11998张高质量图像&#xff0c;支持YOLOv8、COCO、TensorFlow多格式训练&#xff0c;涵盖飞机、无人机、直升机三大目标类别 引言与背景 随着无人机技术的快速发展和广泛应用&#xff0c;无人机检测已成为计算机视觉领域的重要研究方向。无…

作者头像 李华
网站建设 2026/7/1 13:58:58

Java并发利器:CyclicBarrier深度解析

CyclicBarrier 是 Java 并发包中一个可重用的同步辅助工具&#xff0c;用于让一组固定数量的线程互相等待&#xff0c;直到所有线程都到达某个“屏障点”&#xff08;barrier point&#xff09;&#xff0c;然后一起继续执行。它的名字中的 “Cyclic”&#xff08;循环&#xf…

作者头像 李华
网站建设 2026/7/1 13:58:58

救命神器2026 TOP10 AI论文工具:本科生毕业论文写作全测评

救命神器2026 TOP10 AI论文工具&#xff1a;本科生毕业论文写作全测评 2026年学术写作工具测评&#xff1a;为什么你需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文工具已经成为本科生撰写毕业论文的重要辅助手段。然而&#xff0c;面对市场上种类繁多…

作者头像 李华