前序遍历:根左右
中序遍历:左根右
只看前序遍历的话,我们知道第一个节点是根。但是不知道左子树有多少个节点、右子树有多少个节点
知道了根节点是哪个以后,我们就可以根据中序遍历知道左右子树分别有多少个节点。
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;
}
};
京公网安备 11010502036488号