基本思想就是在前序遍历中找第一节点,就是根节点,然后在中序遍历中找到该节点,左边的部分就是左子树,右边的部分就是右子树,然后递归调用该函数,构建左子树和右子树。
需要注意的一点是当以vector做参数的时候,递归调用的时候需要重新构建vector,如果是指针的话可以通过指针的加减来进行操作。
代码如下:
/**
* 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* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int n=pre.size();
if(n<=0)
return NULL;
TreeNode* newnode=new TreeNode(pre[0]);
int i=0;
for(;i<vin.size();i++)
{
if(vin[i]==pre[0])
break;
}
vector<int> pre_left;
vector<int> in_left;
vector<int> pre_right;
vector<int> in_right;
for(int j=0;j<n;j++)
{
if(j<i)
{
pre_left.push_back(pre[j+1]);//除去根节点
in_left.push_back(vin[j]);
}
else if(j>i)
{
pre_right.push_back(pre[j]);
in_right.push_back(vin[j]);
}
}
newnode->left=reConstructBinaryTree(pre_left,in_left);
newnode->right=reConstructBinaryTree(pre_right,in_right);
return newnode;
}
};