【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)
  VJeqq9jk2lCR 2023年11月02日 100 0

小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建

查找节点中带有大写字母的二叉树。 这是她创作的一个例子:

【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)_子树

为了给后代记录她的树,她为每棵树写下了两个字符串:预订单 遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。 对于上面绘制的树,预序遍历是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;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
VJeqq9jk2lCR