首页 > 其他分享 >【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)

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

时间:2023-09-27 13:32:28浏览次数:43  
标签:pre index 遍历 Recovery 题解 右子 mid len 二叉树

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

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

【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;
}

标签:pre,index,遍历,Recovery,题解,右子,mid,len,二叉树
From: https://blog.51cto.com/HEX9CF/7623605

相关文章

  • Codeforces Round 742 Div2 A-D题解
    CodeforcesRound742Div2A-D题解A.DominoDisaster这题就是说给出一些2x1tile,然后给出2xn的第一行构造,问第二行这个刚开始想着是啥dp,一看那么多人过了果断改思路,发现这题就是个模拟题,就是把U换成D,D换成U,L和R不影响,然后输出就行了代码#include<bits/stdc++.h>using......
  • 代码随想录day21 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 2
    530.二叉搜索树的最小绝对差classSolution{private:intresult=INT_MAX;TreeNode*pre=NULL;voidtraversal(TreeNode*cur){if(cur==NULL)return;traversal(cur->left);//左if(pre!=NULL){//中......
  • P6411 [COCI2008-2009#3] MATRICA 题解
    水题。发现根据限制\(M_{i,j}=M_{j,i}\)可以知道除了主对角线上的点,其他的点都是成对出现的。也就是说如果有一条要求的\(a_i\)为奇数,那么至少有一个\(c_i\)在主对角线上。记\(S=\sum\limits_{i=1}^{k}(a_i\equiv1\pmod2)\),即有\(S\)个要求中\(a_i\)为奇数。主对......
  • IDEA中的java代码Getters和Setters报红问题解决办法【杭州多测师_王sir】
    今天在新的编辑器中导入新项目时,发现很多get、set、toString的相关方法全部报红,仔细排查发现,原来是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin,所以全部报红。Lombok简介项目中经常使用bean,entity等类,绝大部分数据类类中都......
  • 二叉树的四种遍历方式
    前序遍历:从根节点开始,然后按照当前结点,左子结点,右子结点的顺序遍历中序遍历:从最左边的子结点开始,然后按照左子结点,当前结点,右子结点的顺序遍历(左中右)后序遍历:从最左边的子结点开始,然后按照左子结点,右子结点,当前结点的顺序遍历(左右中)层序遍历:从根节点开始一层一层的遍历......
  • 链式二叉树的遍历
    如果使用动态创建二叉树需要使用递归,故使用静态的方式创建二叉树代码如下://链式二叉树///使用静态创建二叉树#include<stdio.h>#include<malloc.h>//定义二叉树的数据结构typedefstructbinaryTree{ charvalue;//存储的值 structbinary......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • ## day16 - 二叉树part03
    day16-二叉树part03力扣104.二叉树的最大深度思路:最大深度,即为顶点高度。如果想求高度,人类思维的角度,就是从底层开始算,往上一层+1,加到顶点就是高度,也就是最大深度。因此要用后序遍历,这样可以左右根的顺序进行遍历,从而一层一层向上返回结果,返回到根节点的时候就计算出来了最......
  • P6344 [CCO2017] Vera 与现代艺术 题解
    在\(V\timesV\)的平面上,\(n\)次修改,每次给定\(x,y,v\),令\(a,b\)为不超过\(x,y\)的最大的\(2\)的整数次幂,则所有\((x+pa,y+qb)(p,q为自然数)\)都加上\(v\),最后有\(m\)次单点询问一个位置的值。\(1\lex,y,V\le10^{18},1\lev,n,m\le2\times10^5\)我们可以......
  • P9566 [SDCPC2023] K-Difficult Constructive Problem 题解
    @目录DescriptionSolutionSol1Code1Sol2Code2Description有一个长度为\(n\)的01字符串\(s\),其中部分位置已给出,在?的位置处需填入一个1或0。一个填充方案是好的,当且仅当存在\(m\)个不同的\(i\)满足\(1\lei<n\)且\(s_i\nes_{i+1}\)。求所有好的填充方案中字典......