首页 > 其他分享 >刷刷刷 Day 18 | 106. 从中序与后序遍历序列构造二叉树

刷刷刷 Day 18 | 106. 从中序与后序遍历序列构造二叉树

时间:2023-01-24 19:22:09浏览次数:64  
标签:int 18 中序 106 二叉树 数组 root inorder postorder

106. 从中序与后序遍历序列构造二叉树

LeetCode题目要求

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

图

示例

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
解题思路

想要通过中序和后序遍历序列的数组来构造二叉树,

  1. 首先要找到 root 节点,通过后序遍历的数组的最后一个元素可以找到。
  2. 当找到第一个节点后,由它来分隔中序遍历数组,这样也就可以找到中序数组的左右分隔数组,即为 root 节点的左右子树
  3. 接着再根据第 2 步所分隔出的中序左右数组及下标索引分别得到 中序数组的左右数组索引,和后序数组的左右数组索引
  4. 递归构造左右子树
  5. 返回 root

上代码

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if (inorder.length == 0 || postorder.length == 0) {
            return null;
        }
        return traversal(inorder, postorder, 0, inorder.length, 0, postorder.length);
    }

    private TreeNode traversal(int[] inorder, int[] postorder, int inorderBegin, int inorderEnd, int postorderBegin, int postorderEnd) {
        if (postorderEnd == postorderBegin) {
            return null;
        }
        // 根据 postorder 找到 root 节点,数组最后一个元素
        int rootVal = postorder[postorderEnd - 1];

        // 构造 root 节点
        TreeNode root = new TreeNode(rootVal);
        if (postorderEnd - postorderBegin == 1) {
            return root;
        }

        // 定义分隔 inorder 的索引
        int cutPoint = 0;
        // 切割 inorder 数组,根据已知的 rootVal 进行分隔, 分为中序左数组和中序右数组
        for (int i = 0; i < inorder.length; i++) {
            if (rootVal == inorder[i]) {
                cutPoint = i;
                break;
            }
        }

        // 左中序, 左闭右开
        int leftInorderBegin = inorderBegin;
        int leftInorderEnd = cutPoint;
        // 右中序, 左闭右开
        int rightInorderBegin = cutPoint + 1;
        int rightInorderEnd = inorderEnd;

       // 左后序区间, 左闭右开[leftPostorderBegin, leftPostorderEnd)
        int leftPostorderBegin =  postorderBegin;
        int leftPostorderEnd = postorderBegin + cutPoint - inorderBegin; // 终止位置是 需要加上 中序区间的大小size
        // 右后序区间, 左闭右开[rightPostorderBegin, rightPostorderEnd)
        int rightPostorderBegin = postorderBegin + (cutPoint - inorderBegin);
        int rightPostorderEnd = postorderEnd - 1; // 排除最后一个元素,已经作为节点了

        // 切割 postorer 数组,根据 inorder ,分为[]后序左数组和后序右数组
        root.left = traversal(inorder, postorder, leftInorderBegin, leftInorderEnd, leftPostorderBegin, leftPostorderEnd);
        root.right = traversal(inorder, postorder, rightInorderBegin, rightInorderEnd, rightPostorderBegin, rightPostorderEnd);

        return root;
    }
}
重难点

找 root 节点,然后通过节点分隔中序数组,就找到了左右子树,然后再接着通过中序节点来分隔后序数组,通过递归完成操作
附:学习资料链接

标签:int,18,中序,106,二叉树,数组,root,inorder,postorder
From: https://www.cnblogs.com/blacksonny/p/17066265.html

相关文章

  • 刷刷刷 Day 18 | 路径总和
    112.路径总和LeetCode题目要求给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加......
  • [LeetCode] 1828. Queries on Number of Points Inside a Circle
    Youaregivenanarray points where points[i]=[xi,yi] isthecoordinatesofthe ith pointona2Dplane.Multiplepointscanhavethe same coordinat......
  • 力扣每日一题2023.1.24---1828. 统计一个圆中点的数目
    给你一个数组points,其中points[i]=[xi,yi],表示第i个点在二维平面上的坐标。多个点可能会有相同的坐标。同时给你一个数组queries,其中queries[j]=[xj,yj,......
  • 二叉树
    二叉树是由n个节点构成,它有可能是空树,也有可能是非空树。对于非空树,有且仅有一个根节点,和左右两个不相交的左子树和右子树左子树和右子树有左右之分,不可颠倒......
  • 刷刷刷 Day 18 | 513. 找树左下角的值
    513.找树左下角的值LeetCode题目要求给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。示例输入:[1,2,3,4,......
  • WeetCode4 —— 二叉树遍历与树型DP
    一丶二叉树的遍历1.二叉树遍历递归写法与递归序了解过二叉树的朋友,最开始肯定是从二叉树的遍历开始的,二叉树遍历的递归写法想必大家都有所了解。publicstaticvoidpro......
  • 刷刷刷 Day 17 | 257. 二叉树的所有路径
    257.二叉树的所有路径LeetCode题目要求给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例输入:roo......
  • [20230106]测试宽表查询.txt
    [20230106]测试宽表查询.txt--//https://tanelpoder.com/posts/reasons-why-select-star-is-bad-for-sql-performance/,重复测试:1.环境:SCOTT@test01p>@ver1PORT_STRING......
  • 刷刷刷 Day 17 | 110. 平衡二叉树
    110.平衡二叉树LeetCode题目要求给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值......
  • 刷刷刷 Day 16 | 222. 完全二叉树的节点个数
    222.完全二叉树的节点个数LeetCode题目要求给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外......