算法-遍历二叉树-前序+中序+后序 DFS

本文详细介绍了二叉树的基本概念及其三种遍历方式:前序遍历、中序遍历和后序遍历,并提供了具体的示例和递归实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.算法要求

给定一棵二叉树,分别使用前序,中序,后序遍历二叉树

二.二叉树遍历

1.定义

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点,一般一个二叉树由根节点,左子树,右子树构成,最下面的节点也常称为叶节点。

CSDN-BITDDD

2.前序遍历

Root-Left-Right 根左右,按照这个规则递归即可,这里给出前序遍历的具体操作,中序和后序可以自己实现

示例:

Step1: 根 Root,左 A                                                                               Root-A

Step2: A 的左非None,到达C                                                                  Root-A-C

Step3: C的左非None,到达G                                                                  Root-A-C-G

Step4: 根C,左G已遍历,根据根左右,所以下一个遍历右H                  Root-A-C-G-H

Step5: C数遍历完毕,递归退回A树,遍历A树的右D                               Root-A-C-G-H-D

Step6: 左边所有节点遍历完毕,到达Root的右节点 B                              Root-A-C-G-H-D-B

Step7: B的左节点为E,E的左节点没有,右节点为I                                 Root-A-C-G-H-D-B-I

Step8: E树遍历完毕,退回B树,B树右节点F,退回Root,遍历完毕      Root-A-C-G-H-D-B-I-F

前序遍历: Root A C G H D B E I F 

3.中序遍历

Left-Root-Right 左根右,按照这个规则递归即可

中序遍历: G C H A D Root E I B F 

4.后序遍历

Left-Right-Root 左右根,按照这个规则递归即可

后序遍历: G H C D A I E F B Root 

5.代码实现

代码采用递归实现,每个节点有 Data 节点数据,Left 左子树,Right 右子树三个结构,前序遍历按照根左右,先遍历根节点,再递归遍历左右根节点,中序遍历和后序遍历实现相近,只是顺序不同,分别为左根右和左右根

class BinaryTree(object):
    # 初始化
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

    # 前序遍历 Root-Left-Right 根左右
    def pre_order(self):
        if self.data is not None:
            print(self.data, end=' ')
        if self.left is not None:
            self.left.pre_order()
        if self.right is not None:
            self.right.pre_order()

    # 中序遍历 Left-Root-Right 左根右
    def mid_order(self):
        if self.left is not None:
            self.left.mid_order()
        if self.data is not None:
            print(self.data, end=' ')
        if self.right is not None:
            self.right.mid_order()

    # 后序遍历 Left-Right-Root 左右根
    def post_order(self):
        if self.left is not None:
            self.left.post_order()
        if self.right is not None:
            self.right.post_order()
        if self.data is not None:
            print(self.data, end=' ')

如果想获取上图示例二叉树可以执行如下代码:

    tree_A = BinaryTree("A")
    tree_B = BinaryTree("B")
    tree_C = BinaryTree("C")
    tree_D = BinaryTree("D")
    tree_E = BinaryTree("E")
    tree_F = BinaryTree("F")
    tree_G = BinaryTree("G")
    tree_H = BinaryTree("H")
    tree_I = BinaryTree("I")

    tree = BinaryTree("Root", tree_A, tree_B)
    tree_A.left = tree_C
    tree_A.right = tree_D

    tree_B.left = tree_E
    tree_B.right = tree_F

    tree_C.left = tree_G
    tree_C.right = tree_H

    tree_E.right = tree_I


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值