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

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

题目描述:

思路分析:

后序遍历分析图

中序遍历分析图

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

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

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

  2. 寻找根节点,我们根据 postorder 数组从后往前开始找根节点,第一个节点即为 postorderpostorder.length-1。第一个节点比较容易找到,但是其他的节点就没有那么容易,因此我们准备了一个 index 用来记录找到了多少个节点,这样在找后面的节点的时候我们只需要找postorderpostorder.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;
    }
}
相关推荐
搞科研的小刘选手13 分钟前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议
Java小白笔记21 分钟前
Codex config.toml配置实战指南
人工智能·算法·chatgpt·ai编程·集成学习
王老师青少年编程27 分钟前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
z小猫不吃鱼39 分钟前
模型剪枝经典论文精读:Pruning Filters for Efficient ConvNets
算法·机器学习·剪枝
Fox爱分享2 小时前
字节二面:1000瓶酒,有一瓶是毒药,多少只老鼠可以查出来?
算法·面试·程序员
+wacyltd大模型备案算法备案2 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
Fox爱分享3 小时前
字节二面智力题:100只老虎和1只羊关在一起,这只羊会不会被吃?
算法·面试·程序员
xin(n_n)b3 小时前
经典题目(3):把数字翻译成字符串;兑换零钱
算法
惊鸿一博4 小时前
特征匹配+Glue Factory 框架评估特征提取与匹配算法时常用的度量标准
算法·特征匹配
柒和远方4 小时前
LeetCode 4. 寻找两个正序数组的中位数 —— 二分划分的艺术
javascript·python·算法