当前位置: 首页 > article >正文

[牛客算法总结]:重建二叉树

  

标签:

二叉树、DFS、先序遍历、中序遍历、递归

 

题目:

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

请添加图片描述

提示:
1.vin.length == pre.length
2.pre 和 vin 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围:n \le 2000n≤2000,节点的值 -10000 \le val \le 10000−10000≤val≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

示例1

输入:[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:{1,2,3,4,#,5,6,#,7,#,#,8}
说明:
返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示

示例2

输入:[1],[1]
返回值:{1}

 

反思:个人思考

由于二叉树的先序遍历:根左右、中序遍历:左根右可可以得出:
1、根节点为pre[0]
2、中序遍历中跟位置左边为左子树、右边为右子树
3、通过不断递归、我们可以得出每一个节点

具体思路
// root index = 1
// 先序遍历:[1,2,4,7,3,5,6,8]
// 中序遍历:[4,7,2,1,5,3,8,6]
// 具体思路是:先通过先序遍历的特点找到跟节点,然后通过跟节点来找到根节点在
// 中序遍历中的位置,然后根据中序遍历的特点(左根右),root左边的就是左子树的个数
// root右边的就是右子树的个数,根据这个特点来通过本方法找到root.left,root.right
// 再通过递归,找到每一个节点。

 

用到的知识点:

二叉树、DFS、先序遍历、中序遍历、递归、Arrays.copyOfRange():左包右不包

 

代码:代码内容

    public TreeNode reConstructBinaryTree(int [] pre, int [] vin) {
        if (pre == null || pre.length == 0) return null;
        // 构建具体的树根
        TreeNode root = new TreeNode(pre[0]);

        // 通过先序遍历和中序遍历来找到根节点在中序遍历的位置
        int index = findRootIndexInOrder(pre, vin);

        // 通过递归构建左子树
        root.left = reConstructBinaryTree(
                        Arrays.copyOfRange(pre, 1, index + 1),
                        Arrays.copyOfRange(vin, 0, index)
                    );
        // 通过递归构建右子树
        root.right = reConstructBinaryTree(
                         Arrays.copyOfRange(pre, index + 1, pre.length),
                         Arrays.copyOfRange(vin, index + 1, vin.length)
                     );

        return root;
    }

    public int findRootIndexInOrder(int[] pre, int[] vin) {
        for (int i = 0; i < vin.length; i++) {
            if (pre[0] == vin[i]) return i;
        }
        return 0;
    }

 


http://www.kler.cn/a/946.html

相关文章:

  • 【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)
  • SSE部署后无法连接问题解决
  • BUUCTF:misc刷题记录4(会持续更新的)
  • 分多个AndroidManifest.xml来控制项目编译
  • 【1】Word:邀请函
  • MySQL主从复制
  • Snackbar
  • 【面试题】闭包是什么?this 到底指向谁?
  • 如何成为一名优秀的网络安全工程师?
  • 基于python的超市历年数据可视化分析
  • 【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)
  • 适配器模式
  • 成都欢蓬电商:抖音集星是什么?有什么用?
  • 发光立方体效果 html+css
  • (16)C#传智:线程,Socket网络编程,模式窗体与非模式窗体(第16天)
  • 字符函数和字符串函数(上)-C语言详解
  • 排序算法之插入排序
  • 【算法经典题集】DP和枚举(持续更新~~~)
  • js正则:input 输入限制
  • 关于类型转换
  • CSS实现一个展示框
  • RabbitMQ Java开发教程(二)—官方原版
  • leetcode——27.移除元素
  • 【链表OJ题(六)】链表分割
  • 单调栈图文详解(附Java模板)
  • 【js逆向】hook大全