每日一题~中序后序遍历构造二叉树

原题链接: 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述:

思路分析:

后序遍历分析图

中序遍历分析图

不难看出后序遍历的结果中的最后一个元素就是根节点,倒数第二个元素则是根节点的右子树的根节点,而倒数第三个元素是右子树的新右子树的根节点,依次类推。我们可以根据这一特性先构造二叉树的右子树。

接下来我们再分析一下中序遍历,如图所示,我们将二叉树和中序遍历结果拆开后发现,在**中序遍历中根节点的左侧数据则恰好是二叉树的左子树,而根节点的右侧数据恰好是二叉树的右子树。**根据中序遍历和后序遍历的规律,那么我们就可以将这个还原二叉树的过程分为两大步骤:

  1. 在后序遍历中找根节点;2. 在中序遍历中找到根节点;3. 构建子树。接下来我们详细分析一下这个过程。

  2. 寻找根节点,我们根据 postorder 数组从后往前开始找根节点,第一个节点即为 postorder[postorder.length-1]。第一个节点比较容易找到,但是其他的节点就没有那么容易,因此我们准备了一个 index 用来记录找到了多少个节点,这样在找后面的节点的时候我们只需要找postorder[postorder.length-1-index] 就可以了。

  3. 在 inorder 数组中找到根节点 rootIndex 的位置,这一步骤非常重要,是接下来构建根节点的子树的前提,rootIndex 的左边是左子树,rootIndex 的右边是右子树。

  4. 构建右子树,左子树。必须要先构建右子树,因为 postorder 从后往前的顺序就是右子树在先,左子树在后。

代码示例:

java 复制代码
class Solution {
    public int index = 0;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int len = postorder.length-1;
        return createChild(inorder,postorder,0,inorder.length-1,len);
    }
    public int findIndex(int[] inorder,int val,int beg, int end) {
        for(int i = beg; i <= end; i++) {
            if(inorder[i] == val) return i;
        }
        return -1;
    }
    public TreeNode createChild(int[] inorder,int[] postorder,int beg,int end,int len) {
        if(beg > end) return null;
        
        TreeNode root = new TreeNode(postorder[len-index]);
        // 在中序遍历数组中找到 root 的值的位置
        int rootIndex = findIndex(inorder,postorder[len-index],beg,end);
        index++;
        root.right = createChild(inorder,postorder,rootIndex+1,end,len);
        root.left = createChild(inorder,postorder,beg,rootIndex-1,len);

        return root;
    }
}
相关推荐
不会学习?42 分钟前
算法03 归并分治
算法
NuyoahC1 小时前
笔试——Day43
c++·算法·笔试
2301_821919921 小时前
决策树8.19
算法·决策树·机器学习
秋难降2 小时前
别再用暴力排序了!大小顶堆让「取极值」效率飙升至 O (log n)
python·算法·排序算法
学行库小秘2 小时前
基于门控循环单元的数据回归预测 GRU
人工智能·深度学习·神经网络·算法·回归·gru
_meow_3 小时前
数学建模 15 逻辑回归与随机森林
算法·数学建模·逻辑回归
二向箔reverse3 小时前
机器学习算法核心总结
人工智能·算法·机器学习
猿究院--冯磊4 小时前
JVM垃圾收集器
java·jvm·算法
野犬寒鸦5 小时前
力扣hot100:最大子数组和的两种高效方法:前缀和与Kadane算法(53)
java·后端·算法
我家大宝最可爱5 小时前
动态规划:入门思考篇
算法·动态规划·代理模式