首页 > 其他分享 >106. 从中序与后序遍历序列构造二叉树(leetcode)

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

时间:2024-05-05 11:44:46浏览次数:32  
标签:TreeNode int 106 length 二叉树 inorder leetcode postorder

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

要点是明白中序和后序如何构造二叉树的,并且需要理清当前递归函数的语义,不要一开始就陷入细节,而是思考整棵树与其左右子树的关系,语义是:即构造当前节点,给当前节点左右子树赋值,明白函数的这个语义,利用递归复用这个功能(类似dp子集推大集合,假设子问题已经被解决了,使用子问题推导原问题即可),返回节点即可,剩下的就是处理边界条件和逻辑处理

 

以下是

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

    // 左闭右开
    private TreeNode bulid(int[] inorder,int[] postorder,int inStart,int inEnd,int poStart,int poEnd)
    {
        if(inStart==inEnd)return null;
        TreeNode root = new TreeNode(postorder[poEnd-1]);
        int mid=0;
        for(int i=0;i<inEnd;i++)
            if(root.val==inorder[i])
            {
                mid = i;
                break;
            }
        // 分割先序的左右子树
        int leftInorderStart = inStart;
        int leftInorderEnd = mid;
        int rightInorderStart = mid+1;
        int rightInorderEnd = inEnd;
        // 分割后序的左右子树
        int leftPostorderStart = poStart;
        // leftInorderEnd-leftInorderStart 是先序左子树长度
        int leftPostorderEnd = poStart+leftInorderEnd-leftInorderStart;
        int rightPostorderStart = leftPostorderEnd;
        // 后序最后一位需删除,因此poEnd-1
        int rightPostorderEnd = poEnd-1;
        root.left = bulid(inorder,postorder,leftInorderStart,leftInorderEnd,leftPostorderStart,leftPostorderEnd);
        root.right = bulid(inorder,postorder,rightInorderStart,rightInorderEnd,rightPostorderStart,rightPostorderEnd);
        return root;
    }

}

 

标签:TreeNode,int,106,length,二叉树,inorder,leetcode,postorder
From: https://www.cnblogs.com/lxl-233/p/18173328

相关文章

  • [leetcode 87 扰乱字符串] [剪枝搜索]
    importjava.util.HashMap;importjava.util.Map;classSolution{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();booleanres=solution.isScramble("eebaacbcbcadaaedceaaacadccd","eadcaacabad......
  • 二叉树相关的三个常见算法题
    算法题一//计算一颗二叉树的所有节点的数量intBinaryTree_CountNode(Tnode_t*root){intn1,n2;if(NULL==root){return0;}n1=BinaryTree_CountNode(root->lchild);n2=BinaryTree_CountNode(root->rchild);returnn1+......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--盛最多水的容器
    题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释......
  • leetcode算法热题-爬楼梯
    题目假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1阶+1阶2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1阶+1阶+1阶1......
  • 347. 前 K 个高频元素(leetcode)
    https://leetcode.cn/problems/top-k-frequent-elements/description/可以考虑使用HashMap+排序,不过直接使用优先队列也挺不错,可以使用大顶堆或小顶堆classSolution{publicint[]topKFrequent(int[]nums,intk){Map<Integer,Integer>map=newHas......
  • 239. 滑动窗口最大值(leetcode)
    https://leetcode.cn/problems/sliding-window-maximum/简单的滑动窗口,但是与ACM模式的维护数组不同,在leetcode定义单调队列类更加方便classMyQueue{//单调队列实现,递减Deque<Integer>deque=newLinkedList<>();voidpoll(intval){if(!deque......
  • 二叉树前中后序遍历 迭代法 只需一招!
    核心思想以中序遍历为例在迭代法中我们拿到1节点由于有左孩子我们就会推入2节点,2节点又有左孩子,所以我们推入4,然后弹出2节点,由于这是第二次访问2节点,也就意味着左子树已经去过了,所以推入5节点。那么我们模拟一下栈的变化假设左边为栈顶。1->21->4......
  • leetcode算法热题--字母异位词组合
    题目给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],[&q......