小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建
查找节点中带有大写字母的二叉树。
这是她创作的一个例子:
为了给后代记录她的树,她为每棵树写下了两个字符串:预订单 遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。 对于上面绘制的树,预序遍历是DBACEGF,有序遍历是ABCDEFG。 她认为这样一对字符串将提供足够的信息,以便稍后重建树 (但她从未尝试过)。 现在,几年后,她再次看着琴弦,意识到重建树木确实是 这是可能的,但只是因为她从未在同一棵树上两次使用同一个字母。 然而,手工重建很快就变得乏味。 所以现在她让你写一个程序来帮她完成任务!
输入 输入文件将包含一个或多个测试用例。 每个测试用例由一行组成,其中包含两个字符串“preord”和“order”,表示 二叉树的预序遍历和有序遍历。这两个字符串都由唯一的大写字母组成。 (因此,它们不超过26个字符。) 输入在文件结束时终止。 输出 对于每个测试用例,恢复Valentine的二进制树,并打印一行包含树的postorder 遍历(左子树、右子树、根)。
Sample Input DBACEGF ABCDEFG BCAD CBAD Sample Output ACBFGED CDAB
思路
分别用两个数组存储先序遍历(pre)和中序遍历(mid)序列,先序遍历的第一个元素为根节点d,中序遍历以根节点d为界划分左右子树,中序遍历中查找根节点d,数组下标记为index。在还原二叉树的过程中输出后序遍历序列。
左子树先序遍历起点:pre + 1 左子树中序遍历起点:mid 左子树在数组中的长度:index 右子树先序遍历起点:post + index + 1 右子树中序遍历起点:mid + index + 1 右子树在数组中的长度:len - index - 1
AC代码
#include <iostream>
#include <cstring>
#define AUTHOR "HEX9CF"
using namespace std;
int len;
char pre[30], mid[30];
void restore(char *pre, char *mid, int len)
{
if (0 == len)
{
return;
}
char d = pre[0];
int index = 0;
while (mid[index] != d)
{
index++;
}
restore(pre + 1, mid, index);
restore(pre + index + 1, mid + index + 1, len - index - 1);
cout << d;
}
int main()
{
while (cin >> pre >> mid)
{
len = strlen(pre);
restore(pre, mid, len);
cout << endl;
}
return 0;
}
标签:pre,index,遍历,Recovery,题解,右子,mid,len,二叉树
From: https://blog.51cto.com/HEX9CF/7623605