题目

二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证。

输入:

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 通过先序和中序遍历生成二叉树相关推荐

  1. js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...

    我们在该专栏中记录了我俩的刷题记录. 我们更新的所有题目都在目录中. 今天的题目是 力扣​leetcode-cn.com 题目 We run a preorder depth first search ...

  2. 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)

    文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...

  3. 【中序、后序遍历序列】【前序、中序遍历序列】构造二叉树

    前置知识 第1点:每一个节点都可以看作一棵树的根节点. 第2点:掌握前序.中序.后序遍历顺序.前序遍历:根左右,中序遍历:左根右,后序遍历:左右根. 第3点:掌握双指针或者说滑动窗口,窗口所承载的是左 ...

  4. 理解——先序遍历是入栈过程,中序遍历是出栈过程

    遇到这样一道题:先序序列为a,b,c,d的不同二叉树的个数是多少? 拿到这个问题 首先,要了解到先序遍历和中序遍历都是需要用到栈,其中,先序遍历是入栈过程,中序遍历是出栈过程 然后,二叉树的先序序列和 ...

  5. 二叉树的前序、中序、后序遍历以及根据前序和中序或中序和后序生成二叉树

    二叉树的前序.中序.后序遍历:根据前序和中序或中序和后序生成二叉树 给定如下二叉树: 前序遍历结果:1234567 中序遍历结果:3241657 后序遍历结果:3426751 遍历代码实现:思路:将子 ...

  6. 暑假博客二:由前序中序遍历生成二叉树

    首先我们要知道前序遍历,中序遍历生成二叉树的顺序: 前序遍历:先遍历根节点 再遍历左子树 最后遍历右子树 中序遍历:先遍历左子树 再遍历根节点 最后遍历右子树 我们理一理不用编程的思路来看这个问题: ...

  7. 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是

    已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...

  8. 树形结构:迭代方式遍历树,宽度优先,先序遍历,中序遍历,后序遍历

    迭代的方式处理树,就必须清楚你将要访问的顺序,对应的就是指针怎么走,你必须很清楚 树的宽度优先搜索,他是一层一层的访问,就搞不清楚怎么划分子问题了,但是你访问的顺序 你很清楚,那么就使用迭代的方式实现 ...

  9. c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...

    本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #include #include ...

最新文章

  1. Android Rect 的使用以及与RectF的区别
  2. 为什么TCP的TIME_WAIT状态要保持2MSL?
  3. Salted Password Hashing
  4. C#委托、事件学习之(三)——热水器烧水案例
  5. 统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导
  6. 小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!
  7. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序
  8. C++ queue
  9. 设计每个网站时所追求的5个目标
  10. Docker 核心技术 NameSpace, CGroup, AUFS, DeviceMapper
  11. c语言指针数组反序存放,用指针实现逆序存放数组元素
  12. 2018最新版省市区三级联动数据
  13. HTC M7日版HTL22刷机包 毒蛇2.5.0 ART NFC Sense6.0
  14. 在线展示pdf和word并且不能显示下载和打印按钮
  15. STM32系统时钟详解
  16. java 下载另存为_java中如何实现点击下载出现另存为的对话框
  17. 小姐姐教你用代码画画,真大佬!
  18. android自动唤醒屏幕软件下载,抬手唤醒软件下载-抬手唤醒安卓版下载V1.6手机版-西西软件下载...
  19. TensorFlow 网络模型移植和训练指南
  20. Python学习日记1——python3.8.3安装以及配置环境

热门文章

  1. linux xen 内核,Xen 正式进入 Linux 内核
  2. win10+Ubuntu16.04双系统安装gtx1070驱动 战神笔记本
  3. 计算机应用基础模块四,第四部分计算机应用基础(基础模块)考试说明
  4. Lift Splat Shoot Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 论文阅读笔记
  5. DNS泄漏测试的意义
  6. word哪个版本好用(图文详解)
  7. 独乐乐,不如众乐乐。荐6款私藏已久的良心软件
  8. 如何将ELMo词向量用于中文
  9. 谈PHP发展前景和就业解析(相信更多学习php的跟我有着同样的相当关注吧)
  10. 最热门的13个Java微服务框架