数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出
用前序中序建立二叉树并以层序遍历和后序遍历输出
writer:pprp
实现过程主要是通过递归,进行分解得到结果
代码如下:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000;
struct tree
{
tree* l;
tree* r;
int data;
tree()
{
l = NULL;
r = NULL;
data = 0;
}
};
void LevelOrder(tree * root)
{
queue<tree*> q;
tree * p = root;
q.push(p);
while(!q.empty())
{
p = q.front();
q.pop();
cout << p->data << " ";
if(p->l != NULL)
q.push(p->l);
if(p->r != NULL)
q.push(p->r);
}
}
void PostOrder(tree * root)
{
if(root != NULL)
{
PostOrder(root->l);
PostOrder(root->r);
cout << root->data << " ";
}
}
tree * CreateTree(int* pre, int* in, int n)
{
tree * node = NULL;
int lpre[N], rpre[N];
int lin[N],rin[N];
memset(lin,0,sizeof(lin)),memset(rin,0,sizeof(rin)),
memset(lpre,0,sizeof(lpre)),memset(rpre,0,sizeof(rpre));
if(n == 0)
return NULL;
node = new tree;
node->data = pre[1];
int lincnt = 1, rincnt = 1;
int lprecnt = 1, rprecnt = 1;
// deal with in order
for(int i = 1; i <= n ; i++)
{
if(in[i]!=pre[1])
{
if(i <= lincnt)
lin[lincnt++] = in[i];
else
rin[rincnt++] = in[i];
}
}
lincnt--,rincnt--;
// deal with pre order
for(int i = 2; i <= n ; i++)
{
if(i < (lincnt+2))
lpre[lprecnt++] = pre[i];
else
rpre[rprecnt++] = pre[i];
}
lprecnt--,rprecnt--;
node->l = CreateTree(lpre,lin,lincnt);
node->r = CreateTree(rpre,rin,rincnt);
return node;
}
int main()
{
int n;
cin >> n;
int *pre, *in;
pre = new int[n+1];
in = new int[n+1];
for(int i = 1; i <= n ; i++)
cin >> pre[i];
for(int i = 1; i <= n ; i++)
cin >> in[i];
tree * root = CreateTree(pre,in,n);
LevelOrder(root);
cout << endl;
PostOrder(root);
return 0;
}
数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出的更多相关文章
- 数据结构实习 problem L 由二叉树的中序层序重建二叉树
由二叉树的中序层序重建二叉树 writer:pprp 用层序中序来重建二叉树 代码点这里 其实本质上与前序中序建立二叉树没有什么太大区别 大概思路: 递归解法,对当前层进行处理,通过层序遍历可以得到当 ...
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
- 二叉树:前序遍历、中序遍历、后序遍历,BFS,DFS
1.定义 一棵二叉树由根结点.左子树和右子树三部分组成,若规定 D.L.R 分别代表遍历根结点.遍历左子树.遍历右子树,则二叉树的遍历方式有 6 种:DLR.DRL.LDR.LRD.RDL.RLD.由 ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- 数据结构实习 Problem H 迷宫的最短路径
数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...
- HDU1710---树(知前序遍历与中序遍历 求后序遍历)
知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...
- UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)
题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...
- 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)
好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
随机推荐
- OnePy--构建属于自己的量化回测框架
本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...
- Java8 新特性之Lambda表达式
1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...
- B. Mike and Fun---cf548B(暴力求解)
题目链接:http://codeforces.com/problemset/problem/548/B 有一个n*m的矩阵,里面只有0和1,现在有Q个改变,每次都把(x,y)这点变为相反的点(0变1, ...
- sql 区分大小写
sql server默认是不区分大小写的. 要查看sqlserver数据库是否区分大小写,我么可以查看系统存储过程sys.sp_server_info exec sys.sp_server_info ...
- Redis操作手册
一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...
- 查看Oracle相关日志 ADRCI
ADRCI 进去以后 show home
- Android Study Notes
@1:按下back键退回到home界面时,会调用onDestroy() 按下back键时会调用onDestroy()销毁当前的activity,重新启动此activity时会调用onCreate()重 ...
- selenium 模块
介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如 ...
- MySQL临时表的简单用法(复制)
当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查 ...
- 160726 smarty 笔记(1)
模板里面显示变量:1.变量要写在Smarty标记之间,变量名以$开头<{$test}>2.支持所有类的数据,包括数组(关联数组),对象关联数组在模板显示的时候,除了可以使用php语法之外, ...