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

二叉树的先序,中序,后序遍历的序列_二叉树先序遍历和后序遍历正好相反    二叉树的遍历主要有三种:(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • coding平台_codeserver github

    coding平台_codeserver github这年头,IDE虽然也便宜了,不过,免费,还如此强大的就不多了。Codio,官方号称世界上最强大的基于浏览器的强大免费WebIDE,口号很响亮,当然,我也没用过,希望有朋友用了的,也来冒个泡。因为自己也是才接触这个,看了些国外用户的反馈,感觉还不错。这里就主要给寻找IDE的朋友们推荐这个东西。Codio是一个功能强大的云计算和基于浏览器的IDE(webide),从原型到部署,涵盖了完整的web…

    2022年8月31日
    5
  • 对于java二维数组初始化的理解[通俗易懂]

    对于java二维数组初始化的理解[通俗易懂]1.初始化:在定义变量之后,系统为变量分配的空间内存储的值是不确定的,所以要对这个空间进行初始化以确保程序的安全性和确定性2.给二维数组元素赋值:b[0]={1,2,3}//Arrayconstantscanonlybeusedininitializers数组常量只能被用于初始化,初始化动作在编译时完成。b[0]=newint[]{1,2}//赋值newin…

    2022年5月25日
    35
  • dell服务器显示器fre,戴尔全新 Freesync 显示器,专门针对游戏玩家[通俗易懂]

    dell服务器显示器fre,戴尔全新 Freesync 显示器,专门针对游戏玩家[通俗易懂]戴尔拥有一对全新的Ultrasharp显示器,专门针对游戏玩家,对于那些重视整体速度和响应能力的人来说,它们可能是不久的将来理想的升级途径。运动刷新率高达155Hz,分辨率高达1440P,以及24英寸和27英寸面板的选项,有很多值得关注的新的,配备Freesync的显示器。但这会是如今最好的游戏显示器吗?戴尔2719DGF是一款27英寸TN面板显示器,其机箱外观干净,专…

    2022年6月4日
    32
  • SQL SERVER实例解析

    什么是SQLSERVER实例SQLSERVER实例的概念和“类与对象”的概念很相似。可以把SQLSERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出来的对象称为“SQLSE

    2021年12月22日
    54
  • [数学建模] 大数据建模五步法「建议收藏」

    [数学建模] 大数据建模五步法「建议收藏」目录传送门概要第一步:选择模型或自定义模式第二步:训练模型第三步:评估模型第四步:应用模型第五步:优化模型最后语概要PS:本文转载自https://www.sohu.com/a/198093510_783844本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。第一步:选择模型或自定义模式这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。比如,如果要预测产品销量,则可以选择数值预测模型(比如回归模型,时序预测……);如果要预测员工是否离职,则可以选择分类模型(比

    2022年6月9日
    77
  • 导航窗口用html语言怎么写,html通用导航条制作详解

    导航窗口用html语言怎么写,html通用导航条制作详解第一步:先创建一个盒子,定义类为nav,width1000,height40px,防京东的导航,与浏览器顶部100px,margin-top:100px,看的更直观第二步:使用无序列表放置,导航条的内容,这个可以自己定,这里设定ul宽1000px;高40px;因为ul是块状元素,出现下面的样子,可以思考块状元素在firefox中和ie6下面有什么不同。通常在写样式的时候,要初始化我…

    2022年5月15日
    40

发表回复

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

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