数据结构实验之求二叉树后序遍历和层次遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。

输入

输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。

输出

每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列

示例输入

2
abdegcf
dbgeafc
xnliu
lnixu

示例输出

dgebfca
abcdefg
linux
xnuli

 第一种方法:根据字符串的递推, 由先序、中序直接计算后序串! 在建树,进行层次遍历!         代码:
#include <iostream>
#include <iomanip>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>using namespace std;typedef struct node
{char a;struct node *ll;struct node *rr;
}Binode, *tree;void build(int len, char *s1, char *s2, char *s) //先序中序 推 后序
{if(len<=0)return;int pos; //位置int i;for(i=0; i<len; i++){if(s2[i]==s1[0]){pos=i;break;}}build(pos, s1+1, s2, s );build(len-pos-1, s1+pos+1, s2+pos+1, s+pos );s[len-1]=s1[0];
}//根据先序中序建树
struct node*creat(struct node *root, char *s, char *s1, int n)
{if(n<=0)return NULL;root=new node;root->a=s[0];int p=strchr(s1, s[0] )-s1;root->ll=creat( root->ll, s+1, s1, p );root->rr=creat( root->rr, s+p+1, s1+p+1, n-p-1 );return root;
}//层次遍历 二叉树
void Level_Order(tree root)
{queue<tree>q;tree qq;if(root==NULL)return ;Binode *p=root;cout<<(p->a);if(p->ll)q.push( p->ll );if(p->rr)q.push( p->rr );while(!q.empty()){qq=q.front();q.pop();cout<<qq->a;if(qq->ll)q.push(qq->ll);if(qq->rr)q.push(qq->rr);}return;
}
int main()
{int t;cin>>t;char s1[100], s2[100];char s3[100];while(t--){memset(s3, '\0', sizeof(s3));scanf("%s", s1); //中序scanf("%s", s2); //后序int len=strlen(s1);build(len, s1, s2, s3);printf("%s\n", s3); //输出后序遍历//计算层次遍历tree root, tt;root=creat(tt, s1, s2, len);Level_Order( root);cout<<endl;}return 0;
}

第二种方法:先根据先序、中序建树,在进行后序遍历和层次遍历   代码:
#include <iostream>
#include <iomanip>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>using namespace std;typedef struct node
{char a;struct node *ll;struct node *rr;
}Binode, *tree;//根据先序中序建树
struct node*creat(struct node *root, char *s, char *s1, int n)
{if(n<=0)return NULL;root=new node;root->a=s[0];int p=strchr(s1, s[0] )-s1;root->ll=creat( root->ll, s+1, s1, p );root->rr=creat( root->rr, s+p+1, s1+p+1, n-p-1 );return root;
}void postorder(tree p)
{if(p){postorder(p->ll);postorder(p->rr);printf("%c", p->a );}
}//层次遍历 二叉树
void Level_Order(tree root)
{queue<tree>q;tree qq;if(root==NULL)return ;Binode *p=root;cout<<(p->a);if(p->ll)q.push( p->ll );if(p->rr)q.push( p->rr );while(!q.empty()){qq=q.front();q.pop();cout<<qq->a;if(qq->ll)q.push(qq->ll);if(qq->rr)q.push(qq->rr);}return;
}int main()
{int t;cin>>t;char s1[100], s2[100];char s3[100];while(t--){memset(s3, '\0', sizeof(s3));scanf("%s", s1); //中序scanf("%s", s2); //后序int len=strlen(s1);//计算层次遍历tree root, tt;root=creat(tt, s1, s2, len);postorder(root);cout<<endl;Level_Order( root);cout<<endl;}return 0;
}

 

转载于:https://www.cnblogs.com/yspworld/p/4119700.html

数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)相关推荐

  1. sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...

  2. 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...

  3. 二叉树前中后序遍历以及节点计算

    二叉树前中后序遍历以及节点计算 二叉树 分类 二叉链的数据结构 三叉链的数据结构 四种遍历方法 深度优先遍历:前中后序 广度优先遍历:层序遍历 计算 节点个数 叶子节点个数 树的高度 第k层的节点个数 ...

  4. 二叉树非递归后序遍历算法(C语言)

    二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...

  5. 二叉树非递归后序(后根)遍历

    1.要求 使用非递归方式对二叉树进行(后序)后根遍历. 2.思路 使用先序(先根)遍历,然后将遍历的结果反过来.但要注意:无论是先根遍历还是后根遍历,左子树的遍历始终在右子树之前,所以要使先根遍历结果 ...

  6. 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)

    假设二叉数的数据元素为字符,采用二叉链式存储结构.请编码实现二叉树ADT,其中包括创建二叉树.遍历二叉树(深度.广度).求二叉树的深度(高度).计算二叉树的元素个数.计算二叉树的叶子数.二叉树的格式输 ...

  7. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  8. 【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题

    写在前面 学习二叉树结构,最简单的方式就是遍历.所谓二叉树遍历,就是按照某种特定的规则,一次对二叉树中的节点进行相应的操作,并且每个节点只操作一次. 访问节点所做的操作要看具体的应用问题.遍历是二叉树 ...

  9. 二叉树:给后序中序遍历,求前序

    给出后序中序, 求前序: 1.给后序中序求前序,因为后序序列左右根从后往前是根右左的顺序.因此递归先造右子树,再造左子树. 2.给前序中序求后序,因为前序序列是根左右,从前往后是根左右.因此递归先造左 ...

最新文章

  1. 维吉尼亚密码(Vigenère Cipher)
  2. 关于使用旋转四元数绕轴旋转θ角度时,使用参数是θ/2的理解
  3. 深度探讨 CrossFormer 如何解决跨尺度问题
  4. 【HDU - 5882】Balanced Game (找规律,思维)
  5. Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)
  6. 计算机打开共享网络连接打印机共享打印机,WIN7怎么连接共享打印机?如何设置和连接局域网共享打印机...
  7. (转)Mysql 增删用户
  8. FTP已登录,读取目录列表失败
  9. 利润表模板excel_财务EXCEL必修课 (20小时)
  10. 数值计算(一):引论
  11. 百战程序员python百度网盘_【百战程序员】Python 文件I/O
  12. [个人笔记] vCenter回收活跃虚拟机的剩余可用空间
  13. 《人生七年》纪录片总结
  14. 历年研究生数学建模优秀论文汇总
  15. cache abstraction
  16. csapp lab3 attack 《深入理解计算机系统》实验3攻击超详细0基础解析
  17. 四川企立方:拼多多开店的优点和缺点!
  18. 单刀双掷的模拟开关MAX4544
  19. 万门大学MySQL特训班_如何评价万门大学「理论物理一月特训班」?
  20. what?spring已经解决循环依赖了,为啥还报循环依赖错误?

热门文章

  1. 离人计算机乐谱,离人简谱 林志炫离人挥霍着眼泪,回避还在眼前的离别
  2. js webpack 配置路径_Vue.js学习No.5(WebPack配置二)
  3. restful可以转发么_RESTful 的收益是什么?
  4. 百度开源的依存句法分析系统
  5. 面试常问的深度学习(DNN、CNN、RNN)的相关问题
  6. python用jieba模块分词实现关键词提取
  7. k8s部署jar包_K8S部署SpringBoot应用_都超的博客-CSDN博客_k8s springboot
  8. mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.
  9. PGPool使用限制 1
  10. sql里 where和order by一起使用是怎样的顺序