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

原题链接: 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;
    }
}
相关推荐
sp_fyf_202422 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh2 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy2 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java2 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli2 小时前
滑动窗口->dd爱框框
算法
丶Darling.2 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5203 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19913 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂3 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知3 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表