根据先序序列和中序,后序和中序序列创建二叉树
思考:如何才能确定一棵树?
结论: 通过中序遍历和先序遍历可以确定一个树
通过中序遍历和后续遍历可以确定一个树
通过先序遍历和后序遍历确定不了一个树。
算法实现:
(一)先序和中序重建二叉树,按层次遍历输出
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;struct node
{char data;node *lchild, *rchild, *mparent;
};node* tmpParent = nullptr;
node* CreateBT1(char* pre, char* in, int n)
{node* b;char* p;int k;if (n <= 0 || pre == nullptr || in==nullptr) //代码鲁棒性,细节必须注意return nullptr;b = (node*)malloc(sizeof(node));b->data = *pre;b->mparent = tmpParent;for (p = in; p < in + n; ++p)if (*p == *pre)break;k = p - in;b->lchild = CreateBT1(pre + 1, in, k);b->rchild = CreateBT1(pre + k + 1, p + 1, n - k - 1);return b;
}int first_flag = 0;void layerOrder(node * root)
{queue<node *> ans;ans.push(root);while (!ans.empty()){node * tmp = ans.front();ans.pop();if (first_flag != 0){cout << " ";}cout << tmp->data;first_flag = 1;if (tmp->lchild != NULL) ans.push(tmp->lchild);if (tmp->rchild != NULL) ans.push(tmp->rchild);}
}void DispBTNode(node* b)
{if (b != nullptr){printf("%c ", b->data);if (b->lchild != NULL || b->rchild != NULL){DispBTNode(b->lchild);//printf(",");if (b->rchild!=NULL)DispBTNode(b->rchild);//printf(",");}}
}int main()
{/*for (int i = 0; i<n; i++){cin >> post[i];}for (int i = 0; i<n; i++){cin >> in[i];}*/char str1[40] = { 0 }; char str2[40] = { 0 };printf("请输入先序序列\n"); scanf("%s", str1);printf("请输入中序序列\n"); scanf("%s", str2);int n = strlen(str1);node * root;root = CreateBT1((char*)str1, (char*)str2, n);printf("按中序序列将新建的二叉树输出\n");DispBTNode(root);printf("按后序序列将新建的二叉树输出\n");layerOrder(root);return 0;
}
(二)根据后序序列和中序序列重建树,按层次遍历输出
关于怎样由后序和中序重建二叉树原理读者可以自己查书,本博文仅供作者自己笔记之用
//代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;struct node
{char data;node *lchild, *rchild;
};node* CreateBT2(char* post/*指向后序序列开头的指针*/, char* in/*指向中序序列开头的指针*/, int n)
{char r, *p;int k;if (n <= 0 || post== nullptr || in==nullptr) //代码鲁棒性,细节必须注意return nullptr;r = *(post + n - 1);node* b = (node*)malloc(sizeof(node));b->data = r; //我们要创建的树根节点建立好了for (p = in; p < in + n; ++p)if (*p == r) break;k = p - in; //k是左子树节点数b->lchild = CreateBT2(post, in, k); //这两个语句最关键b->rchild = CreateBT2(post + k, p + 1, n - k - 1);return b;
}/****************打印各节点***********************/
int first_flag = 0;
void layerOrder(node * root)
{queue<node *> ans;ans.push(root);while (!ans.empty()){node * tmp = ans.front();ans.pop();if (first_flag != 0){cout << " ";}cout << tmp->data;first_flag = 1;if (tmp->lchild != NULL) ans.push(tmp->lchild);if (tmp->rchild != NULL) ans.push(tmp->rchild);}
}int main()
{int n;cin >> n;char str1[40] = { 0 }; char str2[40] = { 0 };printf("请输入先序序列\n"); scanf("%s", str1); printf("请输入先序序列\n"); scanf("%s", str2);node * root = CreateBT2(str1, str2, n);layerOrder(root);return 0;
}
根据先序序列和中序,后序和中序序列创建二叉树相关推荐
- 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)
题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...
- 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...
- 由中序和后序(前序)序列求前序(后序)序列
已知二叉树的中序和后序(前序)序列可以唯一确定一颗二叉树,例如, 中序序列:1 2 3 4 5 6 后序序列:3 4 2 6 5 1 可以唯一确定一颗二叉树,如下图: 思路是这样的: 我们知道 ...
- 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)
假设二叉数的数据元素为字符,采用二叉链式存储结构.请编码实现二叉树ADT,其中包括创建二叉树.遍历二叉树(深度.广度).求二叉树的深度(高度).计算二叉树的元素个数.计算二叉树的叶子数.二叉树的格式输 ...
- 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现
二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...
- pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。
5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. #include <cstdio> #include <cstring> #i ...
- 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是
已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...
- 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...
最新文章
- [BZOJ1572][Usaco2009 Open]工作安排Job
- 使用ReaderWriterLock优化文件缓存
- nginx 负载均衡示例
- JAVA多线程中join()方法的详细分析
- TabControl控件和TabPage
- 关于4.8节第一个例子
- redis常用API
- CentOS 8安装并配置NFS服务
- 不懂别瞎搞!Redis 性能优化的 13 条军规!
- matlab控制算法C语言,PID算法Matlab仿真程序和C程序
- java 常用类 练习_Java常用类之String类练习
- 农业不一定靠规模赚钱
- 美团遭遇反垄断调查;微信利用社交垄断封杀西瓜视频;Qt 6 for Python发布|极客头条...
- ASP.NET基础培训 - Cookie的正确利用
- zabbix再爆高危SQL注入漏洞,可获系统权限
- IN和AdaIN原理与代码实现
- 【51CTO学院】双11抽奖规则
- 【iOS】获取App Store上的.ipa包
- 电子科技大学硕士毕业论文和博士毕业论文Latex模板及问题集锦
- 原问题与对偶问题的定义和关系