前序遍历 中左右(先访问根节点)
中序遍历 左中右(中间访问根节点)
前序遍历序列{1,2,4,7,3,5,6,8}
中序遍历序列{4,7,2,1,5,3,8,6}
分析: 前序遍历是中左右,所以第一个一定是根节点的值,根据这个值可以在中序遍历中找到左右子树的分割
左子树的中序遍历 -> 4,7,2 1 5,3,8,6 <-右子树的中序遍历
左子树的先序遍历-> 2,4,7 3,5,6,8 <-右子树的先序遍历
那么我们就可以递归建立树了
上代码
/**
* 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) {
if(pre.size()==0)return NULL;
TreeNode* root=new TreeNode(pre[0]);
//分
int which=-1;
int len=vin.size();
while(vin[++which]!=pre[0]);
// pre 1-which which+1 len-1
// vin 0-which-1 which+1 len-1
vector<int> pre1(pre.begin()+1,pre.begin()+which+1);
vector<int> pre2(pre.begin()+which+1,pre.end());
vector<int> vin1(vin.begin(),vin.begin()+which);
vector<int> vin2(vin.begin()+which+1,vin.end());
root->left=reConstructBinaryTree(pre1,vin1);
root->right=reConstructBinaryTree(pre2,vin2);
return root;
}
};