代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(!inorder.size()) return NULL;
return build(preorder, inorder, 0, 0, inorder.size()-1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre, int in1, int in2)
{
if(pre >= preorder.size() || in1>in2) return NULL;
int temp = 0;
for(int i = in1; i <= in2; i++)
{
if(preorder[pre] == inorder[i])
{
temp = i;
break;
}
}
TreeNode* head = new TreeNode(preorder[pre++]);
head->left = build(preorder, inorder, pre, in1,temp-1);
head->right = build(preorder, inorder, pre + temp-in1, temp+1,in2);
return head;
}
};
思路:
1.前序遍历的数组提供根节点位置
2.中序遍历中可以查到根节点,并分出左右子树
3.进行递归,注意前序遍历节点的位置并非+1