二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反

二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反    二叉树的遍历主要有三种:(1)先(根)序遍历(根左右)(2)中(根)序遍历(左根右)(3)后(根)序遍历(左右根)举个例子:先(根)序遍历(根左右):ABDHEICFJKG中(根)序遍历(左根右):DHBEIAJFKCG后(根)序遍历(左右根):HDIEBJKFGCA    以后(根)序…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

    二叉树的遍历主要有三种:

(1)先(根)序遍历(根左右)

(2)中(根)序遍历(左根右)

(3)后(根)序遍历(左右根)

举个例子:

二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反

先(根)序遍历(根左右):A B D H E I C F J K G

中(根)序遍历(左根右) : D H B E I A J F K C G

后(根)序遍历(左右根) : H D I E B J K F G C A

    以后(根)序遍历为例,每次都是先遍历树的左子树,然后再遍历树的右子树,最后再遍历根节点,以此类推,直至遍历完整个树。

    此外,还有一个命题:给定了二叉树的任何一种遍历序列,都无法唯一确定相应的二叉树。但是如果知道了二叉树的中序遍历序列和任意的另一种遍历序列,就可以唯一地确定二叉树。

例子1:已知二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba)。

(1)中序遍历:debac

后序遍历:dabec

后序遍历序列的最后一个结点是根结点,所以可知c为根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点c只有左子树,没有 右子树。

 

(2)中序遍历:deba

后序遍历:dabe

后序遍历序列的最后一个结点是根结点,所以可知e为c的左子树的根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点e的左子结点是d,右子树是ba。

 

(3)中序遍历:ba

后序遍历:ab

由后序遍历序列可知b为e的右子树的根结点。由中序遍历序列中可看出,a为根结点b的右子结点。

树的结构如下:

二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反

class Node:
    def __init__(self, dat, left=None, right=None):
        self.data = dat
        self.left = left
        self.right = right


def rebuild(rear, center):
    if not rear:
        return
    cur = Node(rear[-1])
    index = center.index(rear[-1])
    cur.left = rebuild(rear[:index], center[:index])
    cur.right = rebuild(rear[index:-1], center[index + 1:]) #rear[index:-1]是到倒数第二个数
    return cur


def pre_order(t):
    if t == None:
        return
    print(t.data)
    pre_order(t.left)
    pre_order(t.right)


if __name__ == "__main__":
    rear = ['d','a','b','e','c']
    center = ['d','e','b','a','c']
    t = rebuild(rear, center)
    pre_order(t)

例子2:已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,它的前序遍历序列是(gdbehfca)。

 

(1)先序遍历:abdgcefh

中序遍历:dgbaechf

先序遍历序列的第一个结点是根结点,所以可知a为根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点a的左子树是dgb,右子树是echf。

a的左子树:

(2)先序遍历:bdg

中序遍历:dgb

先序遍历序列的第一个结点是根结点,所以可知b为a的左子树的根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点b的左子树是dg,没有右子树。

 

b的左子树:

(3)先序遍历:dg

中序遍历:dg

由先序遍历序列可知d为b的左子树的根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点d的右子结点是g。

 

a的右子树:

 

(4)先序遍历:cefh

中序遍历:echf

由先序遍历序列可知c为a的右子树的根结点。

从中序遍历序列中可看出,根结点c的左子结点是e,右子树是hf。

 

 

c的右子树:

(5)先序遍历:fh

中序遍历:hf

由先序遍历序列可知f为c的右子树的根结点。

从中序遍历序列中可看出,根结点f的左子结点是h,没有右子树。

树的结构如下:

二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反

class Node:
    def __init__(self, dat, left=None, right=None):
        self.data = dat
        self.left = left
        self.right = right


def rebuild(pre, center):
    if not pre:
        return
    cur = Node(pre[0])
    index = center.index(pre[0])
    cur.left = rebuild(pre[1:index + 1], center[:index])
    cur.right = rebuild(pre[index + 1:], center[index + 1:])
    return cur


def post_order(t):
    if t == None:
        return
    post_order(t.left)
    post_order(t.right)
    print(t.data)


if __name__ == "__main__":
    pre = ['a','b','d','g','c','e','f','h']
    center = ['d','g','b','a','e','c','h','f']
    t = rebuild(pre, center)
    post_order(t)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193816.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java基础–单链表的实现[通俗易懂]

    Java基础–单链表的实现[通俗易懂]Java内部也有自己的链表–LinkedList,但是我们今天不是讨论LinkedList,而是自己来实现一个单链表,包括简单的增删查改,以及使用链表来实现栈和队列这两种数据结构,涉及的方面如下: 单链表的结构 单链表的基本操作 使用虚拟头结点的单链表 单链表实现栈 单链表实现队列 单链表的结构 一种链式存取的数据结构,单链表中的数据是以结点的形式存在,每一个结点…

    2022年6月14日
    25
  • Gson序列化对象时排除字段

    Gson序列化对象时排除字段

    2022年1月31日
    33
  • 史上最全Java学习视频下载地址分享

    史上最全Java学习视频下载地址分享1.Java基础视频 《张孝祥JAVA视频教程》完整版[RMVB](东西网)历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播客)张孝祥2010年贺岁视频:Java高新技术(传智播客)Java多线程与并发库高级应用(传智播客)尚学堂JAVA视频下载大全(持续更新中…请关注!)(尚学堂)《动力节点,王勇JAVA系列视频教程》(东西网)

    2022年7月8日
    17
  • 机器学习(二):有监督学习、无监督学习和半监督学习

    机器学习(二):有监督学习、无监督学习和半监督学习一、基本概念1特征(feature)数据的特征。举例:书的内容2标签(label)数据的标签。举例:书属于的类别,例如“计算机”“图形学”“英文书”“教材”等。3学习(learning)将很多数据丢给计算机分析,以此来训练该计算机,培养计算机给数据分类的能力。换句话说,学习指的就是找到特征与标签的映射(mapping)关系。这样当有特征而无标签的未知数据输入时,我们就可以通过已有的

    2022年5月27日
    34
  • java实现文件传输

    java实现文件传输

    2021年12月7日
    49
  • Java IO用法详解

    Java IO用法详解一、javaio概述1.1相关概念JavaIOJavaIO即Java输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题…

    2022年5月1日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号