算法地址
其实思路比较好想到,就是如何划分子问题,然后递归的构建左子树和右子树。 inorder = [9,3,15,20,7] postorder = [9,15,7,20,3]
因为后序后遍历根节点,后续最后一个节点为整棵树的根节点,可以确定根节点为3;
再根据中序得到: leftInOrder = [9]
RightInOrder = [15, 20 ,7] 又由于中序和先序的数组大小应该相同的, 所以, LeftPostOrder = [9] RightPostOrder = [15, 7, 20] 至此,划分为子问题: leftInOrder = [9] LeftPostOrder = [9] 构建左子树。 RightPreOrder = [20, 15, 7] RightPostOrder = [15, 7, 20] 构建右子树。
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return helper(inorder,postorder,postorder.length-1,0,inorder.length-1);
}
TreeNode helper(int[] inorder, int[] postorder, int postEnd, int inStart, int inEnd){
if(inStart>inEnd)return null;
int cur=postorder[postEnd];
TreeNode curNode = new TreeNode(cur);
int inIndex=0;
for(int i=inStart;i<=inEnd;i++){
if(inorder[i]==cur){
inIndex=i;
break;
}
}
TreeNode left=helper(inorder,postorder,postEnd-(inEnd-inIndex)-1,inStart,inIndex-1);
TreeNode right=helper(inorder,postorder,postEnd-1,inIndex+1,inEnd);
curNode.left=left;
curNode.right=right;
return curNode;
}
}