c++
思路
前序遍历的首位肯定是根节点,然后找到它在中序遍历的位置就知道了左子树数组与右子树数组。然后pre里面去与中序的左子树相同的长度就是前序的左子树,二者是对应的,可以敌对进行下一轮计算。
递归内部如果是数组长度0则空节点,如果长度1则叶子节点。二者一定要区分开,产生空节点的原因是因为我们的划分规则
class Solution { public: TreeNode* traversal(vector<int> pre,vector<int> vin){ if(pre.size()==0) return NULL; int rootvalue=pre[0]; TreeNode* root=new TreeNode(rootvalue); if(pre.size()==1) return root; int rootindex=0; for(;rootindex<vin.size();rootindex++){ if(vin[rootindex]==rootvalue) break; } vector<int> leftvin(vin.begin(),vin.begin()+rootindex); vector<int> rightvin(vin.begin()+rootindex+1,vin.end()); vector<int> leftpre(pre.begin()+1,pre.begin()+1+rootindex); vector<int> rightpre(pre.begin()+1+rootindex,pre.end()); root->left=traversal(leftpre,leftvin); root->right=traversal(rightpre, rightvin); return root; } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if(pre.size()==0||vin.size()==0) return NULL; return traversal(pre,vin); } };