思考:如何才能确定一棵树?

结论:    通过中序遍历和先序遍历可以确定一个树
                通过中序遍历和后续遍历可以确定一个树

通过先序遍历和后序遍历确定不了一个树。

算法实现:

(一)先序和中序重建二叉树,按层次遍历输出

#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;
}

根据先序序列和中序,后序和中序序列创建二叉树相关推荐

  1. 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)

    题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...

  2. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

    7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...

  3. 由中序和后序(前序)序列求前序(后序)序列

    已知二叉树的中序和后序(前序)序列可以唯一确定一颗二叉树,例如, 中序序列:1 2 3 4 5 6 后序序列:3 4 2 6 5 1 可以唯一确定一颗二叉树,如下图: 思路是这样的:     我们知道 ...

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

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

  5. 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现

    二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...

  6. pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。

    5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...

  7. 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. #include <cstdio> #include <cstring> #i ...

  8. 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是

    已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...

  9. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

最新文章

  1. [BZOJ1572][Usaco2009 Open]工作安排Job
  2. 使用ReaderWriterLock优化文件缓存
  3. nginx 负载均衡示例
  4. JAVA多线程中join()方法的详细分析
  5. TabControl控件和TabPage
  6. 关于4.8节第一个例子
  7. redis常用API
  8. CentOS 8安装并配置NFS服务
  9. 不懂别瞎搞!Redis 性能优化的 13 条军规!
  10. matlab控制算法C语言,PID算法Matlab仿真程序和C程序
  11. java 常用类 练习_Java常用类之String类练习
  12. 农业不一定靠规模赚钱
  13. 美团遭遇反垄断调查;微信利用社交垄断封杀西瓜视频;Qt 6 for Python发布|极客头条...
  14. ASP.NET基础培训 - Cookie的正确利用
  15. zabbix再爆高危SQL注入漏洞,可获系统权限
  16. IN和AdaIN原理与代码实现
  17. 【51CTO学院】双11抽奖规则
  18. 【iOS】获取App Store上的.ipa包
  19. 电子科技大学硕士毕业论文和博士毕业论文Latex模板及问题集锦
  20. 原问题与对偶问题的定义和关系

热门文章

  1. 王曦:大数据人工智能中的运筹与决策科学
  2. 为什么低代码治好了CIO们的 “精神内耗” ?
  3. TOM、腾讯、网易|你了解大厂企业邮箱的登陆入口吗?
  4. 使用requests爬虫制作自己的天气预报“Api”
  5. [VBA]Excel 人员信息管理
  6. 常用Windows系统进程列表
  7. ASEMI代理ADM202EARNZ-REEL原装ADI车规级ADM202EARNZ-REEL
  8. Altium Designer-快速画封装,图解
  9. YGG:2021年年终回顾
  10. Hive常见的面试题