第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; } } } } }