1.从后续遍历结果中取数的根节点中的值域
2.在中序遍历结果中找根节点的位置rootIdx,可以将中序遍历结果划分为左右两部分
左子树中的节点数据[left,rootId)
右子树中的节点数据[rootIdx+1,right)
3.创建根节点
递归创建跟的右子树
递归创建根的左子树
注:在后序遍历中,根节点往前走是右子树,index--,所以建立右子树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// int index=postorder.length-1;
int index=0;
public TreeNode rebuileTree(int[] inorder,int[] postorder,int left,int right){
if(index<0||left>=right){
return null;
}
int rootIdx=left;
while(rootIdx<right){
if(inorder[rootIdx]==postorder[index]){
break;
}
rootIdx++;
}
TreeNode root=new TreeNode(postorder[index]);
--index;
root.right=rebuileTree(inorder,postorder,rootIdx+1,right);
root.left=rebuileTree(inorder,postorder,left,rootIdx);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
index=postorder.length-1;
return rebuileTree(inorder,postorder,0,postorder.length);
}
}