第106题:从中序与后序遍历序列构造二叉树

一. 问题描述

根据一棵树的中序遍历与后序遍历构造二叉树。

 

注意:

你可以假设树中没有重复的元素。

 

例如,给出

 

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

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

返回如下的二叉树:

 

    3

    / \

   9  20

        /  \

      15   7

 

二. 解题思路

本题思路:采用中序和后序遍历的特性进行求解,跟第105题几乎完全相同,只是把前序第一个必定是根节点,改成后序最后一个必定是根节点这点区别,没啥说的,具体可看第105题。

三. 执行结果

执行用时 :21 ms, 在所有 java 提交中击败了37.40%的用户

内存消耗 :51.4 MB, 在所有 java 提交中击败了8.79%的用户

四. Java代码

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(postorder.length>0) {
             TreeNode root =new TreeNode(postorder[postorder.length-1]);
             List<Integer> order=new ArrayList<Integer>();
             for(int i=0;i<inorder.length;i++) {
                 order.add(inorder[i]);
             }
             getTree(postorder,postorder.length-1,order,root);         
             return root;
         } else {
             return null;
         }
    }
      public void getTree(int[]postorder ,int number,List<Integer> order,TreeNode root) {
        if(order.size()==1) {
            return ;
        }
        
        int ordernum=order.indexOf(postorder[number]);
        if(ordernum>0) {
        List<Integer> leftOrder=new ArrayList<Integer>(order.subList(0, ordernum));        
        for(int i=number-1;i>=0;i--)
        {
            if(leftOrder.contains(postorder[i])) {
                root.left=new TreeNode(postorder[i]);
                getTree(postorder,i,leftOrder,root.left);
                break;
            }
            
         }
        }
        
        if(ordernum<order.size()-1)
        {
            List<Integer> rightOrder=new ArrayList<Integer>(order.subList(ordernum+1, order.size()));
            for(int j=number-1;j>=0;j--) {
                if(rightOrder.contains(postorder[j])) {
                    root.right=new TreeNode(postorder[j]);
                    getTree(postorder,j,rightOrder,root.right);
                    break;
                }
            }
        }
       
    }
}

 

posted @ 2019-11-10 10:40  fish大叔  阅读(711)  评论(0编辑  收藏  举报