Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* getnode(int x)
{
TreeNode *t = (TreeNode *)malloc(sizeof(TreeNode));
t->val = x;
t->left = NULL;
t->right = NULL;
return t;
}
TreeNode *buildTree(vector<int> &preorder, int pi, int pj, vector<int> &inorder, int ii, int ij)
{
if(pi > pj)
return NULL;
TreeNode* root = getnode(preorder[pi]);
// find the index of number preorder[pi] in inorder
int i = 0;
for(i = ii; i <= ij; i++)
{
if(preorder[pi] == inorder[i])
break;
}
// count of elements in first half
int left = (i - 1) - ii + 1;
root->left = buildTree(preorder, pi+1, pi + left, inorder, ii, ii + left -1);
root->right = buildTree(preorder, pi+ left + 1, pj, inorder, ii + left + 1, ij);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
if(preorder.size() <= 0)
return NULL;
return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};
No comments:
Post a Comment