题目如下:
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 *buildTree_in(vector<int> &preorder, vector<int> &inorder, int pre_start, int in_start, int len) {
if(len==0)
return NULL;
else if (len==1)
return new TreeNode(preorder[pre_start]);
int i=0;
while((inorder[in_start+i]!=preorder[pre_start])&&(i<in_start+len))
i++;
TreeNode* root=new TreeNode(preorder[pre_start]);
root->left=buildTree_in(preorder,inorder,pre_start+1,in_start,i);
root->right= buildTree_in(preorder,inorder,pre_start+i+1,in_start+i+1,len-i-1);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int len=(int)preorder.size();
if(len==0)
return NULL;
else if (len==1)
return new TreeNode(preorder[0]);
return buildTree_in(preorder,inorder,0,0,len);
}
};
update: 2014 - 12 - 22
其实和上面的思路是基本一样的,只是函数参数略有改变。
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, int pre_start, int pre_end, vector<int> &inorder, int in_start, int in_end) {
if (pre_start > pre_end ) {
return NULL;
} else if (pre_start == pre_end) {
TreeNode* root = new TreeNode(preorder[pre_start]);
return root;
}
TreeNode* root = new TreeNode(preorder[pre_start]);
int index = 0;
for (index = in_start; index <= in_end; ++index ) {
if (inorder[index] == preorder[pre_start])
break;
}
int left_length = index - in_start;
root->left = buildTree(preorder, pre_start + 1, pre_start + left_length, inorder, in_start, index - 1);
root->right = buildTree(preorder, pre_start + 1 + left_length, pre_end, inorder, index + 1, in_end);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
if (preorder.size() == 0 || inorder.size() ==0) return NULL;
return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};