信奥一本通 1364:二叉树遍历(flist)

该博客讨论了一种利用中序和层次遍历序列确定二叉树结构的方法。作者指出,仅凭中序遍历无法找到根节点,必须结合层次遍历。核心思路是找到层次遍历中最早出现的中序遍历元素作为根。然后递归处理左右子树,最终得到先序遍历序列。注意,层次遍历并不直接用于构建树,因为题目未指定是否为完全二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】

树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。

假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。

【输入】

两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。

【输出】

一行,表示二叉树的先序序列。

【输入样例】

DBEAC
ABCDE

【输出样例】

ABDEC

这道题我刚刚做的时候就觉得使

1339

【例3-4】求后序遍历

的举一反三,可是有一个难点总是困扰着我:如何找根呢?然后我在观察后得到了结论: 

中序是不能单独用来找根的——王恩全

所以必须要在层次遍历上找根

那么如何找呢?

 这个点我想了不下于3天,我也是服了

最后终于灵光乍现,找到了思路:可以把中序遍历的[i,r]内的元素中在层序遍历出现的位置最靠前的位置做根

找到根后,其余的都和1339那道题差不多了

对了,这里层序遍历是不需要划分区间的!

代码:

#include <bits/stdc++.h>
using namespace std;
string cen,mid;
int fi(int l,int r)
{
  int ans = 0x3f3f3f3f3f,anp = 0x3f3f3f3f3f;
  for(int i = l; i <= r; i++)//遍历mid
    for(int j = 0; j < cen.size(); j++)//遍历cen
      if(cen[j] == mid[i])
        if(j < anp)
        {
          anp = j;
          ans = i;
        }
  return ans;
}
void f(int l,int r)
{
  int m = fi(l,r);//根在mid中的下标
  cout<<mid[m];//输出
  if(m > l) f(l,m - 1);//左子树
  if(m < r) f(m + 1,r);//右子树
}
int main()
{
  cin>>mid>>cen;
  f(0,mid.size() - 1);
  return 0;
}
//DBEAC
//ABCDE

最后补充一点:

直接通过层次遍历来构建树,最后输出是不行的!!!因为题目没说一定是完全二叉树!!!

40分的代码(通过层次遍历来构建树,最后输出的代码)

#include <bits/stdc++.h>
using namespace std;
string cen,mid;
struct node
{
  char data;
  int l,r;
  node ()
  {
    l = data = r = 0;
  }
};
node a[10001];
void xx(int n)
{
  cout<<a[n].data;
  if(a[n].l) xx(n * 2);
  if(a[n].r) xx(n * 2 + 1);
}
int main()
{
  cin>>mid>>cen;
  for(int i = 1; i <= cen.size(); i++)
  {
    a[i].data = cen[i - 1];
    if(i * 2 <= cen.size()) a[i].l = i * 2;
    if(i * 2 + 1 <= cen.size()) a[i].r = i * 2 + 1;
  }
  xx(1);
  return 0;
}

3Q for您能够看到这里,感谢观看~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值