使用的语言为C++
这棵树的前序遍历结果为pre_v:1,2,4,7,3,5,6,8
这棵树的中序遍历结果为vin_v:4,7,2,1,5,3,8,6
要求重建这棵二叉树并输出后序遍历的结果
分析:根据前序遍历结果和后序遍历结果,我们可以先在草图上画出该二叉树
// 重建后的二叉树
// 1
// / \
// 2 3
// / / \
// 4 5 6
// \ /
// 7 8
思路:
- 先找到整棵树的根节点root,即前序序列中的第一个元素“1”。
- 在中序序列中找到root的索引,即index = vin_v.index(pre_v[0]),index左边是左子树的中序遍历,右边是右子树的中序遍历。
- 前序序列的pre_v[1: index+1]是左子树的前序遍历,pre_v[ index+1:]是右子树的前序遍历。
- 左子树的前序序列的第一个元素是根节点root的左孩子,右子树的前序序列的第一个元素是根节点root的右孩子。
- 递归求解,即可重建该二叉树。
全部代码如下所示:
#include<iostream>
#include<vector>
using namespace std;
//Definition for binary tree
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size() == 0){
return NULL;
}else if(pre.size() == 1){
return new TreeNode(pre[0]);
}else{
TreeNode * root = new TreeNode(pre[0]);
int index = 0;
for(int i=0; i<pre.size(); i++){
if(vin[i] == pre[0]){
index = i;
break;
}
}
vector<int> left_pre, left_vin, right_pre, right_vin;
for(int i=0; i<index; i++){
left_pre.push_back(pre[i+1]);
left_vin.push_back(vin[i]);
}
for(int i=index+1; i<pre.size(); i++){
right_pre.push_back(pre[i]);
right_vin.push_back(vin[i]);
}
root = new TreeNode(pre[0]);
root->left = reConstructBinaryTree(left_pre, left_vin);
root->right = reConstructBinaryTree(right_pre, right_vin);
return root;
}
};
void postOrder(TreeNode * head){
if(head != NULL){
postOrder(head->left);
postOrder(head->right);
printf("%d\n",head->val);
}
};
int main(){
int pre[] = {1,2,4,7,3,5,6,8};
int vin[] = {4,7,2,1,5,3,8,6};
vector<int> pre_v(pre, pre+8);
vector<int> vin_v(vin, vin+8);
TreeNode * root = reConstructBinaryTree(pre_v, vin_v);
postOrder(root);
system("pause");
}
输出结果为: