此题是剑指offer第7题
前中序构造,需要用子数组。如果直接用下标的话,很容易出bug。但这里尝试了只用下标的,细节较多,要分清楚两个数组的开始和结束位置。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre1, int pre2, int in1, int in2)
{
// printf("%d %d %d %d\n", pre1, pre2, in1, in2);
int n = pre2-pre1+1;
if(n == 1)return new TreeNode(preorder[pre1]);
TreeNode *root = new TreeNode(preorder[pre1]);
int p = 0;
for(int i=in1;i<=in2;i++)
{
if(inorder[i] == preorder[pre1])
{
p = i;
break;
}
}
int diff = p-in1;
if(p > in1)root->left = build(preorder, inorder, pre1+1, pre1+diff, in1, p-1);
if(p < in2)root->right = build(preorder, inorder, pre1+diff+1, pre2, p+1, in2);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
return build(preorder, inorder, 0, n-1, 0, n-1);
}
};