前序遍历:根左右
中序遍历:左根右
只看前序遍历的话,我们知道第一个节点是根。但是不知道左子树有多少个节点、右子树有多少个节点
知道了根节点是哪个以后,我们就可以根据中序遍历知道左右子树分别有多少个节点。
c++
class Solution { public: void BuildTree(TreeNode* &root,vector<int>& pre,int preS,vector<int>& vin,int vinS,int len) { if(len == 0){return;} //记录一下根节点 int n = pre[preS]; root = new TreeNode(pre[preS]); int lnum = 0; for(int i = 0 ; i < len ; i++) { if(vin[vinS+i]==n) { break; } lnum++; } BuildTree(root->left,pre,preS+1,vin,vinS,lnum); BuildTree(root->right,pre,preS+1+lnum,vin,vinS+1+lnum,len-lnum-1); } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin){ TreeNode* Root = NULL; int N = pre.size(); BuildTree(Root,pre,0,vin,0,N); return Root; } };