一. 问题描述
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 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;
}
}
}
}
}