二叉树重建是涉及到二叉树知识点中肯定会遇到的问题。前序加中序遍历,或者中序加后序遍历可以唯一地重建一棵二叉树。
如:给定前序遍历数组{1,2,4,7,3,5,6,8},中序遍历数组{4,7,2,1,5,3,8,6},然后重建一棵二叉树;
思路:在前序遍历数组中第一个数肯定是树的根root->val=1,然后根据root在中序数字的位置可以划分出左子树和右子树的中序遍历,同样又可以知道左子树和右子树的前序遍历,此时有:
左子树的前序数组pre_left={2,4,7}
左子树的中序数组vin_left={4,7,2}
右子树的前序数组pre_right={3,5,6,8}
右子树的中序数组vin_right={5,3,8,6}
这样依次递归下去,就可以得到每一个结点,代码如下:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
//如果是空,则返回
if(pre.empty() || vin.empty())return NULL;
//根据前中序列,构造左右子树的前中序列
vector<int>pre_left;
vector<int>pre_right;
vector<int>vin_left;
vector<int>vin_right;
//确定根结点
int value = pre[0];
TreeNode* btree = new TreeNode(value);
//得出左右子树前中序列的数组
int i= 0;
while(vin[i] != value){
vin_left.push_back(vin[i]);
pre_left.push_back(pre[i+1]);
i++;
}
for(int j = i+1;j<vin.size();j++){
vin_right.push_back(vin[j]);
pre_right.push_back(pre[j]);
}
//依次递归下去
btree->left=reConstructBinaryTree(pre_left,vin_left);
btree->right=reConstructBinaryTree(pre_right,vin_right);
return btree;
}
如果是中序加后序遍历,也是一样的,可以根据后序遍历数组得出根结点的值。