知道后续遍历和中序遍历还原二叉树并求层析遍历
来源:互联网 发布:淘宝怎么分期付款手机 编辑:程序博客网 时间:2024/04/29 16:45
题目:
输入n代表二叉树节点数量,接下来两行分边n个整数,代表二叉树的后序遍历和中序遍历
输出层次遍历的顺序
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 10050#define MOD 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define ULL unsigned long longtypedef pair<int , int> pii;const long long INF= 0x3fffffff;int last[maxn] , mid[maxn];int a[maxn] , b[maxn];struct node{ int l , r , val;}tmp , ans[maxn];int res[maxn] , id;void solve1(int root , int l1 , int r1 , int l2 , int r2); //给定左子树的区间void solve2(int root , int l1 , int r1 , int l2 , int r2) //给定右子树的期间{ //cout << root << endl; if(r1 < l1 || l1 > r1 || r2 < l2 || l2 > r2) { ans[root].r = -1; return; } if(l1 == r1) { ans[root].r = a[r1]; return ; } ans[root].r = a[r1]; solve1(ans[root].r , l1 , l1 + mid[a[r1]] - l2 - 1 , l2 , mid[a[r1]] - 1 ); solve2(ans[root].r , l1 + mid[a[r1]] - l2 , r1 - 1 , mid[a[r1]]+1 , r2);}void solve1(int root , int l1 , int r1 , int l2 , int r2){ //cout << root << endl; if(r1 < l1 || l1 > r1 || r2 < l2 || l2 > r2) { ans[root].l = -1; return; } if(l1 == r1) { ans[root].l = a[r1]; return ; } ans[root].l = a[r1]; solve1(ans[root].l , l1 , l1 + mid[a[r1]] - l2 - 1 , l2 , mid[a[r1]] - 1 ); solve2(ans[root].l , l1 + mid[a[r1]] - l2 , r1-1 , mid[a[r1]] +1 , r2);}void BFS(int root){ queue<int>q; while(!q.empty()) q.pop(); q.push(root); while(!q.empty()) { int val = q.front(); q.pop(); res[id++] = val; if(ans[val].l != -1) q.push(ans[val].l); if(ans[val].r != -1) q.push(ans[val].r); // cout << val << " " << ans[val].l << " " << ans[val].r << endl; }}int main(){ int n , m , num , l , r; while(scanf("%d" , &n) != EOF) { id = 0; mem(last , 0); mem(mid , 0); mem(ans , -1); for(int i = 1 ; i <= n ; i ++) { scanf("%d" , &a[i]); last[a[i]] = i; } for(int i = 1 ; i <= n ; i ++) { scanf("%d" , &b[i]); mid[b[i]] = i; } int root = a[n]; solve1(a[n] , 1 , mid[root]-1 , 1 , mid[root] - 1); solve2(a[n] , mid[root] , n-1 , mid[root] + 1 , n); // cout << "YES" << endl; BFS(root); for(int i = 0 ; i < id ; i ++) { printf("%d" , res[i]); if(i != id -1) printf(" "); } cout << endl; } return 0;}
0 0
- 知道后续遍历和中序遍历还原二叉树并求层析遍历
- 二叉树的先序遍历、中序遍历、后续遍历和二叉树还原
- 由二叉树的前序遍历和后续遍历结果还原二叉树,并后序遍历打印
- 从前序遍历和中序遍历求后续遍历
- 从前序遍历和中序遍历求后续遍历
- 已知二叉树前序遍历和中序遍历,求后续遍历
- 已知二叉树的先序(前序)遍历及中序遍历,还原该二叉树并输出其后续遍历
- 二叉树遍历,已知前序遍历与中序遍历,求后续遍历 使用java(递归方式)实现
- 给出二叉树的先序和中序,求二叉树的后续遍历
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 编程实现二叉树的建立,前序遍历,中序遍历和后续遍历
- 由前序遍历和中序遍历重建二叉树,再实现后续遍历
- 算法--根据二叉树前序和中序遍历序列,求后续遍历序列
- 【二叉树遍历】有前序遍历 和 中序遍历 求 后序遍历
- 树-根据前序、中序遍历求后续遍历
- 根据前序遍历和后续遍历建立二叉树
- 通过中序和后续遍历数组重建二叉树
- 树的遍历 有后序遍历和中序遍历建立二叉树,并输出层次遍历
- python实现不可修改的常量
- 机房重构——DataTable转泛型
- 03-树1 树的同构
- 自定义jQuery插件实现分页
- Linux中fork,vfork和clone详解(区别与联系)
- 知道后续遍历和中序遍历还原二叉树并求层析遍历
- linuxc编程一站式学习(c CodingStyle)
- Mac系统配置php环境
- Spark Runtime内幕
- MongoDB学习笔记系列:(八) 复制
- 前端面试问题及答案
- 浮点数在计算机中存储方式
- JVM--运行时数据区域
- 面试:数组:旋转数组的最小值