给出后序中序, 求前序:

1、给后序中序求前序,因为后序序列左右根从后往前是根右左的顺序。因此递归先造右子树,再造左子树。
2、给前序中序求后序,因为前序序列是根左右,从前往后是根左右。因此递归先造左子树再造右子树。
题目:P1030 [NOIP2001 普及组] 求先序排列
字符串版本:
题解:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;const int N = 10010;int pos, n;
string in_s, post_s;
int pre[N], in[N], post[N];
struct node
{int l, r;char w;
}T[N];// 建树
void creat(int inl, int inr, int u)
{// 如果是空子树 返回上一层if(inl > inr) return ;// 赋予当前节点值等于后序序列的右边往左数的数,左右孩子的位置T[u].w = post_s[pos--];T[u].l = 2 * u, T[u].r = 2 * u + 1;//找到中序遍历序列的root节点, int mid;for(mid = inl; mid <= inr; mid++)if(T[u].w == in_s[mid]) break;// 递归创建子树. 如果是给后序序列,先遍历右边,如果是给前序序列,先遍历左边。creat(mid + 1, inr, 2 * u + 1); //必须先递归右子树,因为后续遍历的根节点前面一些点一定是右子树的点,而我们是根据后续遍历的根节逐渐前移来去找递归的creat(inl, mid - 1, 2 * u);
}// 进行层序遍历
void bfs()
{int idx = 0;queue<int> q;q.push(1);while(q.size()){node t = T[q.front()];q.pop();if(!idx) cout << t.w;else cout << " " << t.w;idx++;if(t.l > 0 && t.l <= n) q.push(t.l);if(t.r > 0 && t.r <= n) q.push(t.r);}
}void preout(int u)
{if(T[u].w == -1) return ;cout<<T[u].w;preout(u * 2 );preout(u * 2 + 1);
}
int main()
{cin >> in_s >> post_s;n = in_s.size();pos = n;in_s = " "+ in_s;post_s = " " + post_s;memset(T, -1, sizeof T);// for(int i =0 ; i < n ; i ++)// {//     cout<<T[i].l<<" "<<T[i].r<<" "<<T[i].w<<endl;// }creat(1, n, 1);// bfs();// cout << endl;// cout<<"----"<<endl;preout(1);return 0;
}

数字版本:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;const int N = 10010;int pos, n;
int pre[N], in[N], post[N];
struct node
{int l, r, w;
}T[N];// 建树
void creat(int inl, int inr, int u)
{if(inl > inr) return ;T[u].w = post[pos--];T[u].l = 2 * u, T[u].r = 2 * u + 1;int mid;for(mid = inl; mid <= inr; mid++)if(T[u].w == in[mid]) break;creat(mid + 1, inr, 2 * u + 1); //必须先递归右子树,因为后续遍历的根节点前面一些点一定是右子树的点,而我们是根据后续遍历的根节逐渐前移来去找递归的creat(inl, mid - 1, 2 * u);
}// 进行层序遍历
void bfs()
{int idx = 0;queue<int> q;q.push(1);while(q.size()){node t = T[q.front()];q.pop();if(!idx) cout << t.w;else cout << " " << t.w;idx++;if(T[t.l].w != -1) q.push(t.l);if(T[t.r].w != -1) q.push(t.r);}
}int f = 1;
void preout(int u)
{if(T[u].w == -1) return ;if(f == 1) cout<<T[u].w;else cout<<" "<<T[u].w;f ++;preout(u * 2 );preout(u * 2 + 1);
}
int main()
{cin >> n;pos = n;for(int i = 1; i <= n ; i ++) cin >> post[i];for(int i = 1; i <= n ; i ++) cin >> in[i];memset(T, -1, sizeof T);creat(1, n, 1);// bfs();preout(1);cout << endl;return 0;
}

给后序中序求前序

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;const int N = 1e4+10;int pre[N], in[N], post[N];typedef struct node{int v, l, r;
}node;node T[N];
int n, n1 = 1;void buildTree(int inl, int inr, int u)
{if(inl > inr) return ;T[u].v = pre[n1 ++];T[u].l = u * 2;T[u].r = u * 2 + 1;int mid;for(mid = inl; mid <= inr; mid ++)if(in[mid] == T[u].v) break;buildTree(inl, mid - 1, T[u].l);buildTree(mid + 1, inr, T[u].r);
}void printPost(int u)
{if(T[u].v == -1) return ;printPost(T[u].l);printPost(T[u].r);cout<<T[u].v<<" ";
}int main()
{cin >> n;// n1 = n;for(int i = 1; i <= n ; i ++) cin >> pre[i];for(int i = 1; i <= n ; i ++) cin >> in[i];memset(T, -1, sizeof T);buildTree(1, n, 1);printPost(1);return 0;
}```

二叉树:给后序中序遍历,求前序相关推荐

  1. 二叉树--先序中序遍历求后序遍历

    先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再 ...

  2. 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历

    题目: 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第 ...

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

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

  4. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

  5. 前序中序、后序中序遍历创建二叉树,并检验是否是二叉搜索树,若是则转换为双向链表

    finalbst.h //该程序的作用是根据所给的前序序列以及中序序列或者中序序列以及后序序列创建二叉树 #include <iostream> #include <vector&g ...

  6. 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树

    递归先序遍历和中序遍历 先序: void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t-> ...

  7. 二叉树的构造(前序+中序)---(后序 + 中序)

    二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...

  8. 【算法】【树】已知先序中序序列求后序序列(详细解释)

    题目描述 如题所示,已知先序中序序列建树与求后序序列 算法原理 利用递归和分制的思想,找到当前树先序序列的根节点,然后找到对应中序序列的位置,然后根据根节点在中序序列中的位置来判断左右子树分别的位置, ...

  9. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】

    题目介绍 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...

最新文章

  1. android11有哪种手机,支持安卓11系统的机型有哪些
  2. ## *将以下学生成绩数据,存放在Hdfs上,使用Spark读取完成下面分析**
  3. android preference tab,Android SharedPreference - TabHost问题
  4. html5 sidetoggle,javascript-使用React.js实现SlideToggle功能
  5. Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明
  6. 单循环链表中设置尾指针比设置头指针更好的原因
  7. 阿里云云原生一体化数仓入选 2022数博会“十佳大数据案例”
  8. axure rp 9授权码
  9. winrar打包bat成exe并自动运行
  10. 基于物联网技术的电动车锂电池安全预警系统
  11. 《学习网站》计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
  12. SSM框架医院信息管理系统-患者医生考勤管理挂号管理-病房管理-科室管理- (idea开发javaweb-php-asp.netC#-j2ee-springboot)
  13. OpenStack安装部署报错记录,Error processing default value xxx for Opt type of HostAddress
  14. [小o地图-数据] - 获取全国行政区划轮廓数据(上)
  15. 图解IFRS9 金融工具(6)ECL预期减值
  16. 【龙芯1c库】封装模拟I2C接口和使用示例
  17. 什么是分布式数据存储
  18. LInux中的atime、mtime和ctime
  19. 07夯实基础之JavaEE基础
  20. 囚徒困境困境_所以你现在看到了社会困境

热门文章

  1. model.named_parameters()与model.parameters()
  2. 成功解决WIN系统如何更改默认放在C盘的【我的文档】/【图片】位置的存储路径(修改到其它非系统的盘符)
  3. [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型
  4. ecshop mysql 报错_修复ecshop数据库ecs_sessions.MYI报错
  5. 微机原理与接口技术系列笔记(一)
  6. 【经验科普】实战分析C工程代码可能遇到的编译问题及其解决思路
  7. STL——STL简介、STL六大组件
  8. [ Azure - IAM ] Azure 中的基于角色的访问控制 (RBAC) 与基于属性的访问控制 (ABAC)
  9. 试读2-《白话C++ 练功篇》目录
  10. 本地调试微信之内网穿透 ngrok/frp