题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class Solution{
public:
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin){
int len = vin.size();
if(len <= 0)
return NULL;
vector<int> left_pre, right_pre, left_vin, right_vin;
TreeNode* head = new TreeNode(pre[0]);//定义指向根节点的指针
int gen = 0;//定义中序遍历序列中的根节点的位置为gen
for(int i = 0; i< len; i ++){
if(vin[i] == pre[0]){
gen = i;
break;
}
}
for(int i = 0; i < gen; i ++){
left_pre.push_back(pre[i+1]);
left_vin.push_back(vin[i]);
}
for(int i = gen + 1; i < len, i ++){
right_pre.push_back(pre[i]);
right_vin.push_back(vin[i]);
}
//递归地重建左子树和右子树
head->left = reConstructBinaryTree(left_pre,left_vin);
head->right = reConstructBinaryTree(right_pre,right_vin);
return head;
}
};
/* TreeNode* head = new TreeNode(pre[0]);对这一句的解释:TreeNode* head 是定义一个指针head,
head指向的数据的类型为TreeNode类型;new TreeNode(pre[0]) 是为结点pre[0]开辟一个新空间,将这
个新空间的地址赋给head。 总结起来就是定义了一个head指针,指向根节点pre[0],指针存储着根节点
的地址。*/