zoukankan      html  css  js  c++  java
  • LeetCode Notes_#104_从中序与后序遍历序列构造二叉树

    LeetCode Notes_#104_从中序与后序遍历序列构造二叉树

    Contents

    题目

    根据一棵树的中序遍历与后序遍历构造二叉树。
    注意:
    你可以假设树中没有重复的元素。
    例如,给出

    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7

    思路分析

    这一题的思路与剑指Offer_#7_重建二叉树非常类似,是一个变式,如果掌握了分析题目的方法,那么这一题也很容易。
    唯一的区别在于递归调用的参数不一样。参考如下图解。

    解答

    class Solution {
        HashMap<Integer,Integer> map = new HashMap<>();
        int[] post;
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            if(inorder == null || postorder == null) return null;
            int inLen = inorder.length;
            int postLen = postorder.length;
            if(inLen == 0 || postLen == 0 || inLen != postLen) return null;
            post = postorder;
            for(int i = 0;i <= inLen - 1;i++){
                map.put(inorder[i],i);
            }
            return recur(0,postLen - 1,0,inLen - 1);
        }
    
        private TreeNode recur(int postL,int postR,int inL,int inR){
            if(postL > postR || inL > inR) return null;
            //根节点的值是后序遍历序列的最后一个值
            int rootValue = post[postR];
            TreeNode root = new TreeNode(rootValue);
            int rootIdx = map.get(rootValue);
            root.left = recur(postL,postR - inR + rootIdx - 1,inL,rootIdx - 1);
            root.right = recur(postR - inR + rootIdx,postR - 1,rootIdx + 1,inR);
            return root;
        }
    }

    复杂度分析

    时间复杂度:O(n),需要使用主定理分析
    空间复杂度:O(n),map存储了所有节点,最差情况下,递归调用n层,占用栈空间O(n)

  • 相关阅读:
    格子地图生成导航网格
    Geometry Shader 实现 Wireframe 绘制边线的Shader
    体素爆炸
    弹孔,血迹 等受击表现
    Behaviac 腾讯开源行为树 简介(给策划)
    unable to unroll loop 报错
    Unity编辑器扩展
    追踪弹路径
    代码管理资源属性
    主机排行网重大更新,移动端自适应
  • 原文地址:https://www.cnblogs.com/Howfars/p/13441922.html
Copyright © 2011-2022 走看看