/** * 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 m=pre.size(),n=vin.size(); if(m!=n||m==0) return NULL; return reconstruct(pre,vin,0,m-1,0,n-1); } TreeNode* reconstruct(vector<int> &pre,vector<int> &vin,int l1,int r1,int l2,int r2){ TreeNode* root=new TreeNode(pre[l1]); //创建根节点,并初始化。利用树节点的定义初始化。 if(l1==r1) return root; //如果只有一个节点则返回该节点,也就是根节点 int indexnum=l2; //indexnum用来表示根节点在中序遍历数组vin中的索引数字,即位置。初始值设置为l2 while(indexnum<=r2&&pre[l1]!=vin[indexnum]) indexnum++; //遍历数组vin,找根节点在中序遍历中的位置 int leftlength=indexnum-l2; //根节点的左子树的节点个数 int rightlength=r2-indexnum; //根节点的右子树的节点个数 if(leftlength>0){ //左子树有节点时,递归构造左子树 root->left=reconstruct(pre,vin,l1+1,l1+leftlength,l2,indexnum-1); } if(rightlength>0){ //右子树有节点时,递归构造右子树 root->right=reconstruct(pre,vin,l1+leftlength+1,r1,indexnum+1,r2); } return root; //返回根节点 } };