zoukankan      html  css  js  c++  java
  • 106. Construct Binary Tree from Inorder and Postorder Traversal

    和105一样的。。这个是给IN 和 POST

    POST的最后一个是ROOT

    所以就从后找,几乎一样的

     public TreeNode buildTree(int[] inorder, int[] postorder) {
            if(inorder.length == 0) return null;
    
            int length = postorder.length;
            int tailVal = postorder[length-1];
            int tempIndex = length-1;
    
            while(tailVal != inorder[tempIndex])
            {
            	tempIndex--;
            }
    
            TreeNode root = new TreeNode(tailVal);
            int[] newIn = Arrays.copyOfRange(inorder,tempIndex+1,length);
            int[] newPost = Arrays.copyOfRange(postorder,tempIndex,length-1);
            root.right = buildTree(newIn,newPost);
    
            newIn = Arrays.copyOfRange(inorder,0,tempIndex);
            newPost = Arrays.copyOfRange(postorder,0,tempIndex);
            root.left = buildTree(newIn,newPost);
    
    
            return root;
    
        }
    




    二刷。

    二刷做的我想打人了。

    尝试不建新Array,迭代4个index,结果没找对关系,浪费了好多时间。

    最后老老实实重新copyRangeOf了。

    感觉直接用INDEX是可以实现的。

    public class Solution 
    {
        public TreeNode buildTree(int[] in, int[] po) 
        {
            if(in.length == 0) return null;
            return generate(in,po);
        }
        
        public TreeNode generate(int[] in, int[] po)
        {
            if(in.length == 0) return null;
            if(in.length == 1) return new TreeNode(po[0]);
            
            int rootVal = po[po.length-1];
            int temp = 0;
            TreeNode root = new TreeNode(rootVal);
            for(int i = 0; i < in.length ;i++)
            {
                if(in[i] == rootVal)
                {
                    temp = i;
                    break;
                }
            }
            
          
                int[] leftIn = Arrays.copyOfRange(in,0,temp);
                int[] leftPo = Arrays.copyOfRange(po,0,temp);
                root.left = generate(leftIn,leftPo);            
    
                int[] rightIn = Arrays.copyOfRange(in,temp+1,in.length);
                int[] rightPo = Arrays.copyOfRange(po,temp,po.length-1);
        
                root.right = generate(rightIn,rightPo);
            
    
            
            return root;
        }
    }
    

    Got my ass kicked by 90%+ ppl.



    三刷。

    postOrder的最后一个一定是当前ROOT。
    在InOrder里寻找ROOT.VAL,找到位置的左边是LEFT,右边是RIGHT,进行递归。

    一刷二刷是新建了ARRAY,没必要,直接记录进入递归的区间就可以了。

    public class Solution {
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            return convert(inorder, 0, inorder.length-1, postorder, 0, postorder.length-1);
        }
        public TreeNode convert(int[] in, int inL, int inR, 
                                int[] post, int postL, int postR) {
            
            if (postL > postR) return null;
            if (postL == postR) return new TreeNode(post[postR]);
            
            TreeNode res = new TreeNode(post[postR]);
            int i = 0;
            while (post[postR] != in[inR - i]) i++;
            
            res.left = convert(in, inL, inR-i-1, post, postL, postR-i-1);
            res.right = convert(in, inR-i+1, inR, post, postR-i, postR-1);
            return res;
        }
    }
    
  • 相关阅读:
    算法图解——求Int整型数二进制中1的个数
    图解算法——句子逆序
    图解算法——反转字符串
    图解算法——整数倒置
    《图解算法》之狄克斯特拉算法
    图解算法——合并两个有序链表
    图解算法——括号匹配
    图解算法——两数之和
    #热烈庆祝我党成立100周年#
    jQuery全选反选
  • 原文地址:https://www.cnblogs.com/reboot329/p/6109067.html
Copyright © 2011-2022 走看看