原理就是,每次从后续遍历的尾部取出一个元素,以这个元素为分割点,
将中序和后序序列分为两边,再分别在两边里面做递归
代码容易出错,所以最好加上调试语句,方便找错
public class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
TreeNode root = new TreeNode();
if (inorder.length == 0) return root;
root=traversal(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
return root;
}
public TreeNode traversal(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft, int postRight) {
if (postLeft > postRight || inLeft > inRight) return null;
int val=postorder[postRight];
System.out.println("val:"+val);
System.out.println("inleft:"+inLeft+" inright:"+inRight+" postleft:"+postLeft+" postright:"+postRight);
TreeNode root=new TreeNode(val);
if (postLeft == postRight || inLeft == inRight) return root;
int inPtr;
for ( inPtr=inLeft;inPtr<inRight;inPtr++){
if (inorder[inPtr]==val) break;
}
int num=inPtr-inLeft;
int postPtr=postLeft+num;
System.out.println("inptr:"+inPtr+" postPtr"+postPtr);
System.out.println("-------------");
System.out.println("inorder left:");
for (int i=inLeft;i<=inPtr-1;i++)
System.out.println(inorder[i]);
System.out.println("inorder right:");
for (int i=inPtr+1;i<=inRight;i++)
System.out.println(inorder[i]);
System.out.println("postorder left");
for (int i=postLeft;i<=postPtr-1;i++)
System.out.println(postorder[i]);
System.out.println("postorder right");
for (int i=postPtr;i<=postRight-1;i++)
System.out.println(postorder[i]);
TreeNode leftNode=traversal(inorder,inLeft,inPtr-1,postorder,postLeft,postPtr-1);
TreeNode rightNode=traversal(inorder,inPtr+1,inRight,postorder,postPtr,postRight-1);
root.left=leftNode;
root.right=rightNode;
return root;
}
}