根据定义,后序遍历的最后一个是父节点,和中序遍历序列整合。可以分别得出左右孩子的中序遍历序列和后序遍历序列,一直递归可以得到整个二叉树。
代码如下:
public class lc106 {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder.length == 0) return null;
if (inorder.length == 1) return new TreeNode(inorder[0]);
int nodeVal = postorder[postorder.length - 1];
TreeNode node = new TreeNode(nodeVal);
int index; //find father's index
int len = inorder.length;
for (index = 0; index < len; index++) {
if (inorder[index] == nodeVal) break;
}
int[] leftInOrder = new int[index];
int[] leftPostOrder = new int[index];
int[] rightInOrder = new int[len-index-1];
int[] rightPostOrder = new int[len-index-1];
for(int i=0;i<len;i++){
if(i<index) {
leftInOrder[i] = inorder[i];
leftPostOrder[i] = postorder[i];
}
if(i>index){
rightInOrder[i-index-1] = inorder[i];
}
if (i>=index&&i<len-1){
rightPostOrder[i-index] = postorder[i];
}
}
node.left = buildTree(leftInOrder,leftPostOrder);
node.right = buildTree(rightInOrder,rightPostOrder);
return node;
}
}
写的有点长还可以继续优化。