数据结构实习 problem L 由二叉树的中序层序重建二叉树
由二叉树的中序层序重建二叉树
writer:pprp
用层序中序来重建二叉树
其实本质上与前序中序建立二叉树没有什么太大区别
大概思路:
递归解法,对当前层进行处理,通过层序遍历可以得到当前的根节点,然后在中序遍历中找到该节点,对左右两边的内容进行分析,理想情况下应该是可以递归进行下去,找到左子树的中序遍历和层序遍历,找到右子树的中序遍历和层序遍历,然后进行递归,但是可以发现,层序遍历是交错的,所以是需要重新处理以后才能进行递归
现在只要通过处理得到左子树右子树的层序遍历序列就好了,通过两层循环找到在左子树中出现的元素在层序遍历中出现的顺序,并将其存储在新开的数组中,然后就可以继续递归下去了
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 10000;
struct tree
{
tree * l, *r;
int data;
tree()
{
l = r = NULL;
data = 0;
}
};
int layer[maxn], in[maxn];
//前序遍历
void PreOrder(tree * root)
{
if(root != NULL)
{
cout << root->data << " ";
PreOrder(root->l);
PreOrder(root->r);
}
}
//后序遍历
void PostOrder(tree * root)
{
if(root != NULL)
{
PostOrder(root->l);
PostOrder(root->r);
cout << root->data << " ";
}
}
//从 0 开始
tree * CreateTree(int * layer, int * in, int t)
{
if(t == 0) return NULL;
int Llayer[maxn], Rlayer[maxn];
int Lin[maxn], Rin[maxn];
tree * node = new tree;
node->data = layer[0];
//find the place of the root
int i;
for(i = 0; i < t; i++)
if(in[i] == layer[0])
break;
//in order
int cnt = 0;
for(int j = 0; j < i ; j++)
Lin[cnt++] = in[j];
cnt = 0;
for(int j = i+1; j < t; j++)
Rin[cnt++] = in[j];
cnt--;
//layer order
int Llayercnt = 0;
int Rlayercnt = 0;
for(int j = 1; j < t ; j++)
for(int k = 0 ; k < i ; k++)
if(layer[j] == in[k])
Llayer[Llayercnt++] = layer[j];
for(int j = 1; j < t; j++)
for(int k = i ; k < t; k++)
if(layer[j] == in[k])
Rlayer[Rlayercnt++] = layer[j];
node->l = CreateTree(Llayer,Lin,Llayercnt);
node->r = CreateTree(Rlayer,Rin,Rlayercnt);
return node;
}
int main()
{
int n;
cin >> n;
for(int i = 0 ; i < n ; i++)cin >> layer[i];
for(int i = 0 ; i < n ; i++)cin >> in[i];
tree * root;
root = CreateTree(layer,in,n);
PreOrder(root);
cout << endl;
PostOrder(root);
return 0;
}
数据结构实习 problem L 由二叉树的中序层序重建二叉树的更多相关文章
- [leetcode]_根据二叉树的先序遍历(后序遍历) + 中序遍历 重建二叉树
题目1:Construct Binary Tree from Preorder and Inorder Traversal 给定一棵二叉树的先序遍历和中序遍历,求重建二叉树. 思路: 1.先序遍历的第 ...
- 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...
- 利用层序遍历(含空节点)和中序遍历重建二叉树 python
给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...
- 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- SDUT-3343_数据结构实验之二叉树四:(先序中序)还原二叉树
数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一棵二叉树的先序遍历 ...
- SDUT OJ 数据结构实验之二叉树四:(先序中序)还原二叉树
数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- 数据结构实习 Problem H 迷宫的最短路径
数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...
- 数据结构《10》----二叉树 Morris 中序遍历
无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度. Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), ...
- 数据结构实习 - problem M 判断平衡二叉树
writer:pprp date: 20171103 题目描述 给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的.如果是,输出YES如果不是输出NO. 输入 树结点个数 中序遍历序列 层序遍历序 ...
随机推荐
- Spark 源码分析 -- RDD
关于RDD, 详细可以参考Spark的论文, 下面看下源码 A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. ...
- Mysql日常操作
创建用户并授权 grant all privileges on test.* to "test"@"localhost" identified by " ...
- UVA11426 GCD - Extreme (II)---欧拉函数的运用
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 【使用时发生的意外】HDFS 分布式写入问题 AlreadyBeingCreatedException
进行追加文件时出现AlreadyBeingCreatedException错误 堆栈信息大致如下: org.apache.hadoop.ipc.RemoteException(org.apache.h ...
- git学习------>git-rev-parse命令初识
一.准备工作 第一步:在d盘git test目录下,新建工作区根目录demo,进入该目录后,执行git init创建版本库. DH207891+OuyangPeng@DH207891 MINGW32 ...
- SSM框架关于后台返回JSON数据中显示很多不需要的字段为NULL
xml 配置 spring mvc 的 json 返回忽略 null 字段 <mvc:annotation-driven> <mvc:message-converters regis ...
- PHP计算经纬度之间的距离
<?php /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 $ ,lng2 经度 * @param lat1 $ ,lat2 纬度 * @return floa ...
- Linux中的yum的配置以及常见报错的处理
一. 今天登录服务器的时候,误把yum所在的cache文件夹中的文件删除掉了,导致yum不能够使用,解决的方法: 显示错误如下: Loaded plugins: fastestmirror Deter ...
- IPFS搭建&集群
下载go-ipfs wget https://github.com/ipfs/go-ipfs/releases/download/v0.4.17/go-ipfs_v0.4.17_linux-amd64 ...
- IOS 此时无法安装XXX
背景介绍 替一家公司做了企业APP,由于经常需要更新,考虑到上传到APP Store的审核过程,所以当初选定了是用企业证书发布,然后通过网页自动跳转下载APP. 事情原委 昨天下午突然接到客户反馈,I ...