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

【数据结构和算法实践-树-LeetCode105-从前序与中序遍历构造二叉树】

数据结构和算法实践-树-LeetCode105-从前序与中序遍历构造二叉树

    • 题目
    • My Thought
    • 代码示例
      • JAVA-8

题目

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

My Thought

题目给定的是通过前序和中序的数组,结合示例,故核心点是通过数组的root去锚定树的左右两边:
一、前序遍历是根左右
二、中序遍历是左根右
三、前序遍历与中序遍历的关联就是root
四、以前序数组做树的基线,拿中序遍历锚定左右的顺序
4.1、以前序为基线,preorder的范围是i ~ i1;inorder的范围为i2~i3;
4.2、那么第一次构建的时候 i=0 i1 =preorder.lengh i2 =0 i3 = inorder.lengh
4.2、于是通过preorder去找到了第一个根节点,以及从根节点出发的left和right;中序可以铆钉root的位置find,从而锚定前序节点的左树范围
4.3、left 的范围为 preorder 的范围是i+1 ~ i+find+i2;inorder的范围是 i2~find-1
4.4、right的范围为 preorder的范围是 i+find+i2+1~i1;inorder的范围是find+1 ~i3

一、自我调用
二、终止条件:即函数边界

注意点:树、递归

代码示例

JAVA-8

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null || preorder.length != inorder.length) {
            return null;
        }
        HashMap<Integer, Integer> valueIndexMap = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            valueIndexMap.put(inorder[i], i);
        }
        return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, valueIndexMap);
    }

    private TreeNode buildTree(int[] preorder, int i, int i1, int[] inorder, int i2, int i3, HashMap<Integer, Integer> valueIndexMap) {

        //先找到preorder中的root和inorder中年的root的位置
        if (i > i1) {
            return null;
        }
        TreeNode root = new TreeNode(preorder[i]);
        if (i == i1) {
            return root;
        }
        int find = valueIndexMap.get(preorder[i]);
        root.left = buildTree(preorder, i + 1, i + find - i2, inorder, i2, find - 1, valueIndexMap);
        root.right = buildTree(preorder, i + find - i2 + 1, i1, inorder, find + 1, i3, valueIndexMap);
        return root;
    }

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

相关文章:

  • 变压器制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型
  • iPhone照片删不掉?原因探索及解决方案
  • 【数据获取与读取】JSON CSV
  • Pr:首选项 - 音频硬件
  • C语言中的消息队列详解(4)
  • VueX:初学者指南与深入理解
  • web项目如何部署到服务器上呢?——麻烦的方法
  • MobaXterm配置
  • [项目实战]EOS单节点部署
  • WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器
  • Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】
  • Jenkins生成html报告
  • Nature子刊|C4平台助力单细胞多组学分析,揭秘睾丸生殖细胞瘤的分子特征
  • Vue解說
  • 攻防世界 supersqli
  • EmguCV学习笔记 VB.Net 10.1 人脸检测 CascadeClassifier类
  • qt --如何获取本地联网的网口mac地址
  • 想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件
  • 【机器学习】5 ——过拟合,正则化
  • The Prompt Report 2