华为OD机试统一考试D卷C卷 - 二叉树计算
题目描述
给出一个二叉树如下图所示:
请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。
左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。
输入描述
2行整数,第1行表示二叉树的中序遍历,第2行表示二叉树的前序遍历,以空格分割。
输出描述
1行整数,表示求和树的中序遍历,以空格分割
用例
输入
-3 12 6 8 9 -10 -7
8 12 -3 6 -10 9 -7
输出
0 3 0 7 0 2 0
Java
import java.util.*;
import java.util.stream.*;
public class Main {
// 方法:根据中序和前序遍历构造二叉树
// 参数:preorder 前序遍历的结果,inorder 中序遍历的结果
public static TreeNode buildTree(int[] preorder, int[] inorder) {
// 调用辅助方法,传入遍历结果和对应的开始结束索引
return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
// 定义树的节点结构
private static class TreeNode {
int val; // 节点的值
TreeNode left; // 左子节点
TreeNode right; // 右子节点
TreeNode(int x) { val = x; } // 构造方法
}
// 辅助方法:根据中序和前序遍历的一部分构造子树
private static TreeNode build(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
// 如果前序遍历的开始索引大于结束索引,说明这部分遍历结果为空,返回null
if (preStart > preEnd) return null;
// 创建根节点,值为前序遍历的第一个元素
TreeNode root = new TreeNode(preorder[preStart]);
int inIndex = 0; // 初始化中序遍历中根节点的索引
// 在中序遍历中找到根节点的位置
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root.val) {
inIndex = i;
break;
}
}
// 计算左子树的大小
int leftTreeSize = inInd
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
机试E卷D卷刷题日记 文章被收录于专栏
机试刷题记录