【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客
python、C、C++、JS、java代码实现:
【华为OD】D卷真题100分:完全二叉树非叶子部分后序遍历 python代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:完全二叉树非叶子部分后序遍历 C代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:完全二叉树非叶子部分后序遍历 C++代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:完全二叉树非叶子部分后序遍历 JavaScript代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:完全二叉树非叶子部分后序遍历 Java代码实现[思路+代码]-CSDN博客
题目描述:
给定一个以顺序储存结构存储整数值的完全二叉树序列(最多1000个整数),请找出此完全二叉树的所有非叶子节点部分,然后采用后序遍历方式将此部分树(不包含叶子)输出。
1、只有一个节点的树,此节点认定为根节点(非叶子)。
2、此完全二叉树并非满二叉树,可能存在倒数第二层出现叶子或者无右叶子的情况
其他说明:二叉树的后序遍历是基于根来说的,遍历顺序为:左-右-根
输入描述
一个通过空格分割的整数序列字符串
输出描述
非叶子部分树结构的后序遍历结果
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1 2 3 4 5 6 7
输出
2 3 1
说明
找到非叶子部分树结构,然后采用后续遍历输出
备注
输出数字以空格分隔
wumu1024
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + + + | +
| + | + | + +----+ | | + + + | +
| + 3 | + | + + + 2 | | 2 + + + | +
| + | + | + + + | | + + + | +
| +---+ + | | | + ----+ | +---+ | | + | +
| | + | | | + | | | | | | + | +
| 1 | + | 8 | | + 1 | | | 1 | | 1 | | + | +
| | + | | | + | | | | | | | + | +
| +---+ + +---+ | ++---+ ++ +---+ +---+ | + | +
| | + | | | ++ | | |+ | +
|0 | + | 0 | 0 | ++ | 0 | |+ | +
| | + | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
使用递归的方式来处理即可,按照用例的输入来看,可以找到规律 ,下标p从0开始,其2个子节点分别为 2*p+1,2*p+2,可以一直遍历下去,然后后序的结果输出,顺序为: 左右根
代码实现:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
private static void test(ArrayList<Integer> arr, int p) {
if (2 * p + 1 >= arr.size()) {
return;
}
test(arr, p * 2 + 1);
test(arr, p * 2 + 2);
System.out.print(arr.get(p) + " ");
}
public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
arr.add(n);
}
if (arr.size() == 1) {
System.out.println(arr.get(0));
return;
}
test(arr, 0);
System.out.println();
}
}