中序遍历java6_Java 通过先序和中序遍历生成二叉树
题目
二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证。
输入:
1 2 3 4 5 6 7 8 9 10
3 2 5 4 1 7 8 6 10 9
输出:
1,2,3,4,5,6,7,8,9,10
3,2,5,4,1,7,8,6,10,9
3,5,4,2,8,7,10,9,6,1
分析
以上述输入为例,该树的结构为:
在解决这方面问题时,需要把控这几个因素:
(1)前序的第一个元素必为根节点;
(2)中序中在根节点左边的为左子树,在根节点右边的为右子树。
抓住上面两点,就可以无限递归,从而产生一个完整的二叉树。
算法演算
前序:1 2 3 4 5 6 7 8 9 10
中序:3 2 5 4 1 7 8 6 10 9
(1)第一次:
产生节点 1。
生成左子树
先序:2 3 4 5
中序:3 2 5 4
生成右子树
前序:6 7 8 9 10
中序:7 8 6 10 9
(2)第二次
产生节点 2(由左子树得来,故为第一次结点的左子树)。
生成左子树
前序:3
中序:3
生成右子树
先序:4 5
中序:5 4
(3)第三次
产生节点 3(同上,产生左子树)
(4)第四次(因为Return,所以处理第二次产生的右子树)
产生结点 4
生成左子树
先序:null
中序:null
生成右子树
先序:5
后续:5
……
以此类推,即可轻松生成一棵二叉树。
实现代码
packageDataStructe;importJava.util.ArrayList;importjava.util.Scanner;public classTreeReBuild {/*先序(DLR)、中序(LDR)遍历对应的三个数组*/
static ArrayList DLR=new ArrayList();static ArrayList LDR=new ArrayList();static node root=newnode();/*二叉树的结点结构*/
static classnode{
node rchild;
node lchild;intdata;
node(intndata)
{
data=ndata;
rchild=null;
lchild=null;
}publicnode() {
rchild=null;
lchild=null;
}
}/*核心算法*/
static void reBuildTreeprocess(node x,ArrayList qx,ArrayListzx)
{
x.data=qx.get(0);//前序第一个元素必为根节点
if(qx.size()<=1)
{return;
}
x.lchild=newnode();
x.rchild=newnode();//两个序列的拆分索引
int rootindex = 0;int qxindex=0;/*拆分序列*/ArrayListnewqxleft = new ArrayList();
ArrayListnewqxright= new ArrayList();
ArrayListnewzxleft = new ArrayList();
ArrayListnewzxright = new ArrayList();//拆分中序
for(int j=0;j
{if(zx.get(j)==x.data)
{
zx.remove(j);
j--;
rootindex=j;break;
}
}//生成新的中序(左)
for(int j=0;j<=rootindex;j++){
newzxleft.add(zx.get(j));
}//生成新的中序(右)
for(int j=rootindex+1;j
{
newzxright.add(zx.get(j));
}//拆分前序,确定分离的元素索引
if(newzxright.isEmpty())
{//中序右为空,前序全为左子树
for(int i=1;i
{
newqxleft.add(qx.get(i));
}
x.rchild=null;
reBuildTreeprocess(x.lchild, newqxleft, newzxleft);
}else{if(newzxleft.isEmpty())
{//中序左为空,前序全为右子树
for(int i=1;i
{
newqxright.add(qx.get(i));
}
x.lchild=null;
reBuildTreeprocess(x.rchild, newqxright, newzxright);
}else{//均不为空,分别生成
outer: for(int r=0;r
{for(int i=0;i
{if(qx.get(r)==newzxright.get(i))
{
qxindex=r;breakouter;
}
}
}for(int t=1;t
{
newqxleft.add(qx.get(t));
}for(int y=qxindex;y
{
newqxright.add(qx.get(y));
}
reBuildTreeprocess(x.lchild, newqxleft, newzxleft);
reBuildTreeprocess(x.rchild, newqxright, newzxright);
}
}
}/*先序遍历,用于测试结果*/
static voidXSearch(node x)
{if (x==null) {return;
}
System.out.print(x.data+",");if (x.lchild!=null) {
XSearch(x.lchild);
}if(x.rchild!=null){
XSearch(x.rchild);
}
}/*中续遍历,用于测试结果*/
static voidZSearch(node x)
{if (x==null) {return;
}if (x.lchild!=null) {
ZSearch(x.lchild);
}
System.out.print(x.data+",");if(x.rchild!=null){
ZSearch(x.rchild);
}
}/*后续遍历,用于测试结果*/
static voidHSearch(node x)
{if (x==null) {return;
}if (x.lchild!=null) {
HSearch(x.lchild);
}if(x.rchild!=null){
HSearch(x.rchild);
}
System.out.print(x.data+",");
}public static voidmain(String[] args) {
Scanner getin=newScanner(System.in);/*读入先序序列*/String readydata=getin.nextLine();
String []DLRdata=readydata.split(" ");for(int i=0;i
{int qxdata=Integer.parseInt(DLRdata[i]);
DLR.add(qxdata);
}/*读入中序序列*/readydata=getin.nextLine();
String[]LDRdata=readydata.split(" ");for(int i=0;i
{int zxdata=Integer.parseInt(LDRdata[i]);
LDR.add(zxdata);
}
reBuildTreeprocess(root, DLR, LDR);
XSearch(root);
System.out.println();
ZSearch(root);
System.out.println();
HSearch(root);
System.out.println();
}
}
中序遍历java6_Java 通过先序和中序遍历生成二叉树相关推荐
- js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...
我们在该专栏中记录了我俩的刷题记录. 我们更新的所有题目都在目录中. 今天的题目是 力扣leetcode-cn.com 题目 We run a preorder depth first search ...
- 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)
文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...
- 【中序、后序遍历序列】【前序、中序遍历序列】构造二叉树
前置知识 第1点:每一个节点都可以看作一棵树的根节点. 第2点:掌握前序.中序.后序遍历顺序.前序遍历:根左右,中序遍历:左根右,后序遍历:左右根. 第3点:掌握双指针或者说滑动窗口,窗口所承载的是左 ...
- 理解——先序遍历是入栈过程,中序遍历是出栈过程
遇到这样一道题:先序序列为a,b,c,d的不同二叉树的个数是多少? 拿到这个问题 首先,要了解到先序遍历和中序遍历都是需要用到栈,其中,先序遍历是入栈过程,中序遍历是出栈过程 然后,二叉树的先序序列和 ...
- 二叉树的前序、中序、后序遍历以及根据前序和中序或中序和后序生成二叉树
二叉树的前序.中序.后序遍历:根据前序和中序或中序和后序生成二叉树 给定如下二叉树: 前序遍历结果:1234567 中序遍历结果:3241657 后序遍历结果:3426751 遍历代码实现:思路:将子 ...
- 暑假博客二:由前序中序遍历生成二叉树
首先我们要知道前序遍历,中序遍历生成二叉树的顺序: 前序遍历:先遍历根节点 再遍历左子树 最后遍历右子树 中序遍历:先遍历左子树 再遍历根节点 最后遍历右子树 我们理一理不用编程的思路来看这个问题: ...
- 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是
已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...
- 树形结构:迭代方式遍历树,宽度优先,先序遍历,中序遍历,后序遍历
迭代的方式处理树,就必须清楚你将要访问的顺序,对应的就是指针怎么走,你必须很清楚 树的宽度优先搜索,他是一层一层的访问,就搞不清楚怎么划分子问题了,但是你访问的顺序 你很清楚,那么就使用迭代的方式实现 ...
- c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...
本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #include #include ...
最新文章
- Android Rect 的使用以及与RectF的区别
- 为什么TCP的TIME_WAIT状态要保持2MSL?
- Salted Password Hashing
- C#委托、事件学习之(三)——热水器烧水案例
- 统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导
- 小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!
- 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序
- C++ queue
- 设计每个网站时所追求的5个目标
- Docker 核心技术 NameSpace, CGroup, AUFS, DeviceMapper
- c语言指针数组反序存放,用指针实现逆序存放数组元素
- 2018最新版省市区三级联动数据
- HTC M7日版HTL22刷机包 毒蛇2.5.0 ART NFC Sense6.0
- 在线展示pdf和word并且不能显示下载和打印按钮
- STM32系统时钟详解
- java 下载另存为_java中如何实现点击下载出现另存为的对话框
- 小姐姐教你用代码画画,真大佬!
- android自动唤醒屏幕软件下载,抬手唤醒软件下载-抬手唤醒安卓版下载V1.6手机版-西西软件下载...
- TensorFlow 网络模型移植和训练指南
- Python学习日记1——python3.8.3安装以及配置环境
热门文章
- linux xen 内核,Xen 正式进入 Linux 内核
- win10+Ubuntu16.04双系统安装gtx1070驱动 战神笔记本
- 计算机应用基础模块四,第四部分计算机应用基础(基础模块)考试说明
- Lift Splat Shoot Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 论文阅读笔记
- DNS泄漏测试的意义
- word哪个版本好用(图文详解)
- 独乐乐,不如众乐乐。荐6款私藏已久的良心软件
- 如何将ELMo词向量用于中文
- 谈PHP发展前景和就业解析(相信更多学习php的跟我有着同样的相当关注吧)
- 最热门的13个Java微服务框架