二叉树的前序遍历、中序遍历、后序遍历

Python代码实现二叉树

以下的实现思想是借鉴的尚硅谷-韩顺平数据结构与算法的java实现,韩顺平老师视频地址-https://www.bilibili.com/video/BV1E4411H73v?p=15
大概的思路是用两个类来实现,一个类是实现结点的,另一个类是操作节点的类。把对二叉树的三种遍历方式放到了结点类种。
以下是实现代码:

class Node:
    def __init__(self,id,name):
    #假设节点中存储的是id, name, 左子节点, 右子节点四个信息
        self.id = id
        self.name = name
        self.left = None
        self.right = None

    def __str__(self):
        return "Node: id-{}, name-{}, height-{}".format(self.id, self.name,self.getheight())

    # 前序遍历,先输出,再往左遍历,再往右遍历
    def preOrder(self):
        print(self)
        if self.left:
            self.left.preOrder()
        if self.right:
            self.right.preOrder()

    # 中序遍历先左遍历,再输出,再往右遍历
    def infixOrder(self):
        if self.left:
            self.left.infixOrder()
        print(self)
        if self.right:
            self.right.infixOrder()
    #后序遍历,先往左遍历,再往右遍历,后输出
    def postOrder(self):
        if self.left:
            self.left.postOrder()
        if self.right:
            self.right.postOrder()
        print(self)


class BinaryTree:
    def __init__(self):
    #二叉树的初始化,创建一个头节点。
        self.root = Node(None, Node)

    # 在添加数据的时候实现了二叉排序树
    def add(self,id,name):
        temp = self.root
        while True:
            if temp.id == None:
                self.root.id = id
                self.root.name = name
                return
            else:
                faid = temp.id
                if id >= faid:
                    if temp.right:
                        temp = temp.right
                    else:
                        temp.right = Node(id, name)
                        return
                else:
                    if temp.left:
                        temp = temp.left
                    else:
                        temp.left = Node(id, name)
                        return

    def pre(self):
        self.root.preOrder()

    def infix(self):
        self.root.infixOrder()

    def after(self):
        self.root.postOrder()

三种遍历结果

三种遍历方式的不同之处在于print语句的位置,前序遍历是在左遍历和右遍历之前,中序遍历是在中间,后续遍历是在最后。
在这里插入图片描述
前序遍历的结果是:A-B-C-D-E-F-G-H-I
结合代码来看,先从A开始,然后输出A,遍历左子树,输出B,再遍历左子树,输出C,在遍历左子树,发现左子树为空,然后遍历C的右子树,输出D,然后遍历左子树,发现左子树为空,遍历右子树,发现右子树为空,这时就会回到C,C已经遍历完了,就会回到B,开始遍历B的右子树,输出E,E的左右子树都为空,又会回到B,B遍历完了,回到A,开始遍历A的右子树,相同的步骤,得到最后的结果。

中序遍历的结果是:C-D-B-E-A-F-H-G-I
还是结合代码来看,print语句再中间,此时从A开始,会一遗址进行左子树的遍历,直到左子树为空时,就会输出第一个左子树为空的结点,也就是C,然后遍历右子树,右子树是D,D的左子树为空,输出D,D的右子树也为空,此时就会回到B,B的左子树已经遍历完了,这时就会输出B,然后继续遍历右子树,E的左子树为空,输出E,E的右子树为空,回到A,遍历A的右子树,同样的方式进行下去,得到最终结果。

后序遍历的结果是:D-C-E-B-H-I-G-F-A
理解了中序遍历后,结合代码不难理解后序遍历,只不过是调了以下print语句的位置。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值