struct TreeNode* build_Tree(int* postorder, int postorderSize, int* inorder, int inorderSize,int *root,int range1,int range2)
{
if(*root<0)
return NULL;
if(range1>range2)
return NULL;
struct TreeNode* Root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
Root->val=postorder[*root];
int i=0,index=0;
for(i=range1;i<=range2;i++)
{
if(inorder[i]==postorder[*root])
{
index=i;
break;
}
}
*root-=1;
Root->right=build_Tree(postorder,postorderSize,inorder,inorderSize,root,index+1,range2);
Root->left=build_Tree(postorder,postorderSize,inorder,inorderSize,root,range1,index-1);
return Root;
}
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize){
if(postorderSize==0)
return NULL;
int root=postorderSize-1;
return build_Tree(postorder,postorderSize,inorder,inorderSize,&root,0,inorderSize-1);
}
递归
class Solution {
int postorderIndex = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
postorderIndex = inorder.length-1;
return buildT(inorder,postorder,0,inorder.length-1);
}
public TreeNode buildT(int[] inorder,int[] postorder,int l,int r){
if(l > r)
return null;
int rootIndex = 0;
for(int i = l; i <= r; i++){
if(inorder[i] == postorder[postorderIndex]){
rootIndex = i;
break;
}
}
TreeNode root = new TreeNode(inorder[rootIndex]);
postorderIndex -= 1;
root.right = buildT(inorder,postorder,rootIndex+1,r);
root.left = buildT(inorder,postorder,l,rootIndex-1);
return root;
}
}
迭代
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
int n = postorder.length;
Stack<TreeNode> stack = new Stack<>();
TreeNode root = new TreeNode(postorder[n-1]);
stack.push(root);
int inorderIndex = n-1;
TreeNode node = null;
for(int i = n-2; i >= 0; i--){
if(!stack.isEmpty() && stack.peek().val != inorder[inorderIndex]){
node = stack.peek();
node.right = new TreeNode(postorder[i]);
stack.push(node.right);
}else{
while(!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]){
node = stack.pop();
inorderIndex -= 1;
}
node.left = new TreeNode(postorder[i]);
stack.push(node.left);
}
}
return root;
}
}