Question
This may not be a tough problem,but that rack my brain by a while…
So I want to record it down for myself.
Code
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
/*
1.Take the preorder[0] as root for now;
2.Find the same node in inorder,get it's index;
3.Malloc as a new node;
4.Recursive:
The point that confused me is how to divide the preorder and inorder.At last,I know:the index of root you find is the boundary.That means how many nodes left the root in inorder is the same as how many nodes left in preorder.
*/
struct TreeNode* buildTreePreorderInorder(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if(preorderSize<=0 || inorderSize<=0)
return NULL;
struct TreeNode *root=NULL;
int val = preorder[0];
int i=0;
for(;i<inorderSize && val!=inorder[i];++i);
if(i>=inorderSize)
return NULL;
root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = val;
root->left = buildTreePreorderInorder(&preorder[1],i,inorder,i);
root->right = buildTreePreorderInorder(&preorder[i+1],preorderSize-1-i,&inorder[i+1],inorderSize-i-1);
return root;
}
//
struct TreeNode* buildTreeInorderPostorder(int* inorder, int inorderSize, int* postorder, int postorderSize) {
if(inorderSize<=0 || postorderSize<=0)
return NULL;
struct TreeNode *root = NULL;
int val = postorder[postorderSize-1];
int i = 0;
for(;i<inorderSize && val!=inorder[i];++i);
if(i>=inorderSize)
return NULL;
root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = val;
root->left = buildTreeInorderPostorder(inorder,i,postorder,i);
root->right = buildTreeInorderPostorder(&inorder[i+1],inorderSize-i-1,&postorder[i],postorderSize-1-i);
return root;
}