华为OD机试统一考试D卷C卷 - 二叉树计算

题目描述

给出一个二叉树如下图所示:

image-20240219094626190

请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。

image-20240219094722295

左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。

输入描述

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卷刷题日记 文章被收录于专栏

机试刷题记录

全部评论
我直接悟了
点赞 回复 分享
发布于 2023-03-28 11:27 陕西

相关推荐

评论
4
6
分享

创作者周榜

更多
牛客网
牛客企业服务