数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)
数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
输出
示例输入
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
数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)相关推荐
- sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...
- 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...
- 二叉树前中后序遍历以及节点计算
二叉树前中后序遍历以及节点计算 二叉树 分类 二叉链的数据结构 三叉链的数据结构 四种遍历方法 深度优先遍历:前中后序 广度优先遍历:层序遍历 计算 节点个数 叶子节点个数 树的高度 第k层的节点个数 ...
- 二叉树非递归后序遍历算法(C语言)
二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...
- 二叉树非递归后序(后根)遍历
1.要求 使用非递归方式对二叉树进行(后序)后根遍历. 2.思路 使用先序(先根)遍历,然后将遍历的结果反过来.但要注意:无论是先根遍历还是后根遍历,左子树的遍历始终在右子树之前,所以要使先根遍历结果 ...
- 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)
假设二叉数的数据元素为字符,采用二叉链式存储结构.请编码实现二叉树ADT,其中包括创建二叉树.遍历二叉树(深度.广度).求二叉树的深度(高度).计算二叉树的元素个数.计算二叉树的叶子数.二叉树的格式输 ...
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...
- 【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
写在前面 学习二叉树结构,最简单的方式就是遍历.所谓二叉树遍历,就是按照某种特定的规则,一次对二叉树中的节点进行相应的操作,并且每个节点只操作一次. 访问节点所做的操作要看具体的应用问题.遍历是二叉树 ...
- 二叉树:给后序中序遍历,求前序
给出后序中序, 求前序: 1.给后序中序求前序,因为后序序列左右根从后往前是根右左的顺序.因此递归先造右子树,再造左子树. 2.给前序中序求后序,因为前序序列是根左右,从前往后是根左右.因此递归先造左 ...
最新文章
- 维吉尼亚密码(Vigenère Cipher)
- 关于使用旋转四元数绕轴旋转θ角度时,使用参数是θ/2的理解
- 深度探讨 CrossFormer 如何解决跨尺度问题
- 【HDU - 5882】Balanced Game (找规律,思维)
- Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)
- 计算机打开共享网络连接打印机共享打印机,WIN7怎么连接共享打印机?如何设置和连接局域网共享打印机...
- (转)Mysql 增删用户
- FTP已登录,读取目录列表失败
- 利润表模板excel_财务EXCEL必修课 (20小时)
- 数值计算(一):引论
- 百战程序员python百度网盘_【百战程序员】Python 文件I/O
- [个人笔记] vCenter回收活跃虚拟机的剩余可用空间
- 《人生七年》纪录片总结
- 历年研究生数学建模优秀论文汇总
- cache abstraction
- csapp lab3 attack 《深入理解计算机系统》实验3攻击超详细0基础解析
- 四川企立方:拼多多开店的优点和缺点!
- 单刀双掷的模拟开关MAX4544
- 万门大学MySQL特训班_如何评价万门大学「理论物理一月特训班」?
- what?spring已经解决循环依赖了,为啥还报循环依赖错误?
热门文章
- 离人计算机乐谱,离人简谱 林志炫离人挥霍着眼泪,回避还在眼前的离别
- js webpack 配置路径_Vue.js学习No.5(WebPack配置二)
- restful可以转发么_RESTful 的收益是什么?
- 百度开源的依存句法分析系统
- 面试常问的深度学习(DNN、CNN、RNN)的相关问题
- python用jieba模块分词实现关键词提取
- k8s部署jar包_K8S部署SpringBoot应用_都超的博客-CSDN博客_k8s springboot
- mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.
- PGPool使用限制 1
- sql里 where和order by一起使用是怎样的顺序