先序序列+中序序列建立二叉树
输入样例:
第一行输入序列长度n,第二行输入n个字符表示二叉树先序遍历的序列,第三行输入n个字符表示二叉树中序遍历的序列
9
ABDGHCEFI
GDHBAECIF
输出样例:
输出二叉树后序遍历的序列。
GHDBEIFCA
代码示例如下:
#include<bits/stdc++.h>
using namespace std;
/*
9
ABDGHCEFI
GDHBAECIF
结果:GHDBEIFCA
*/
struct treeNode
{
char data;
treeNode* left; //左孩子
treeNode* right; //右孩子
};
// 前序:中左右
// 中序:左中右
void CreateTree_pre_middle(treeNode* &node, string pre_order, string in_order, int pre1, int pre2, int middle1, int middle2)
{
//前提条件
if (pre2 >= pre1 && middle2 >= middle1)
{
node = new treeNode();
//第一个是根节点
node->data = pre_order[pre1];
//初始化
node->left = node->right = nullptr;
//在中序中找到根节点 i 的位置
int i;
for (i = middle1; i <= middle2; ++i)
{
if (in_order[i] == node->data)
break;
}
//创建左子树和右子树
//注意这里是:node->left,node->right,不是node
CreateTree_pre_middle(node->left, pre_order, in_order, pre1 + 1, pre1 + i - middle1, middle1, i - 1);
CreateTree_pre_middle(node->right, pre_order, in_order, pre1 + i - middle1 + 1, pre2, i + 1, middle2);
}
}
void post_view(treeNode* node)
{
if (node == nullptr) return;
post_view(node->left);
post_view(node->right);
cout << node->data;
}
int main()
{
int n;
cin >> n;
string pre_order, in_order;
cin >> pre_order >> in_order;
treeNode* root;
CreateTree_pre_middle(root, pre_order, in_order, 0, n - 1, 0, n - 1);
post_view(root);
return 0;
}