二叉树的遍历问题

简介: 二叉树的遍历问题

二叉树的定义是用递归定义的,这样我们会发现在它在前中后遍历、甚至插入、建立程序中常常用到递归,实际上把握好了递归,也就把握好了二叉树的遍历问题。

下面是一些问题练习


1.从一个遍历(明确空树)中确定树


时间限制: 1 Sec 内存限制: 32 MB

提交: 312 解决: 186

[提交][状态][讨论版][命题人:外部导入]


题目描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。

例如如下的先序遍历字符串:

ABC##DE#G##F###

其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。


输入


输入包括1行字符串,长度不超过100。


输出


可能有多组测试数据,对于每组数据,

输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。

每个输出结果占一行。


样例输入

a#b#cdef#####

a##

样例输出

a b f e d c

a


分析:

这个问题其实简单,题目是给出了前序遍历的输入,如果我们也跟着前序遍历,过程中再建立树,题目就可解了,不过得注意边界条件发生了变化。

#include<iostream> 
#include<string>
using namespace std;
string s;
int i,n;     //用来记录字符串位置和大小
struct node{
  char data;
  node *lchild,*rchild;
};
node* Create(){    //和前序遍历过程很类似
    if(s[i]=='#'){    //边界条件 
      i++;
  return NULL; }
  node* root=new node;
  root->data=s[i];
  i++;
  if(i<n)          //边界条件,可以一起写在上面
  root->lchild=Create();
  if(i<n)
  root->rchild=Create();
  return root;  
}
void inorder (node* root){  //中序遍历 
  if(root==NULL)return;
  inorder(root->lchild);
  printf("%c ",root->data);
  inorder(root->rchild);
}
int main(){
  while(cin>>s) {
  i=0; 
  n=s.length();
  node* root=Create();
  inorder(root);
  cout<<endl;
}
   return 0;
}


2.从两个遍历确定树


题目描述

小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。


输入

输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。


输出

对于每组输入,输出对应的二叉树的后续遍历结果。


样例输入

DBACEGF ABCDEFG

BCAD CBAD

样例输出

ACBFGED

CDAB


分析:

先序第一个是根结点,在中序中找到后划分左右子树,左右子树的长度可知,因为先序遍历中是根左右排布,所以也可以得到左右子树区间,再分区间递归解决即可。

#include<iostream> 
#include<cstring>
using namespace std;
const int maxn=40;
char a[maxn] ,b[maxn];
struct node{
  char data;
  node *lchild,*rchild;
};
node* create(int prel,int preh,int inl,int inh){
  if(prel>preh){   边界条件
  return NULL;
  }
  node* root=new node;
  root->data=a[prel];
  int k;
  for(int i=inl;i<=inh;i++)
  if(a[prel]==b[i]){
     k=i;                  //找到中序遍历中根结点位置 
  break;
      }
      int newpreh=k-inl+prel;//先序中左右子树临界点
  root->lchild=create(prel+1,newpreh,inl,k-1);
  root->rchild=create(newpreh+1,preh,k+1,inh);
}
void postsearch(node* root){  //后序遍历
  if(root==NULL)return;
  postsearch(root->lchild);
  postsearch(root->rchild);
  cout<<root->data;
}
int main(){
  node* root;
  while(cin>>a>>b){
  int i=strlen(a);
  root=create(0,i-1,0,i-1);
  postsearch(root);cout<<endl;
  }
  return 0;
}
相关文章
|
算法
ShardingSphere原理分析和实战总结(二)
ShardingSphere原理分析和实战总结
329 1
|
SQL JavaScript 前端开发
TypeScript(node)连接使用MySQL(JavaScript也一样)
node的mysql包可以帮助我们使用JavaScript来连接mysql。
561 0
|
SQL 关系型数据库 MySQL
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
2158 0
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1017 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1711 9