二叉树的前序、中序、后续、层序遍历原理及Python代码实现

本文详细介绍了二叉树的前序、中序、后序和层序遍历的原理,并提供了相应的Python代码实现,帮助读者理解和掌握二叉树的遍历方法。
摘要由CSDN通过智能技术生成

二叉树的前序、中序、后续、层序遍历原理及Python代码实现


正好前几天被一个学弟问了一下数据结构里的二叉树的问题,这毕竟也是老黄历了,翻了翻之前的博客,WordPress的数据库一团糟,当时写的好几篇文章全是乱码,明明密码是对的结果硬是提示错误。还是想办法重新写一个吧,之前用的C语言,也已经忘得差不多了,这次用Python重新写一写,顺带测试一下新的水印功能((#.#))

1. 引言

二叉树遍历:是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问一次且仅被访问一次

二叉树的遍历方式分为:前序遍历、中序遍历、后序遍历、层序遍历

image-20210114031110150

2. 原理及代码实现

例图都是我手画的,由于涉及到后续代码,我给每个节点加上了a[i]的下标方便理解

2.1 前序遍历

2.1.1前序遍历原理
image-20210114033647532

前序遍历的公式为:根节点 → 左子树 → 右子树

那么,结果就为:A→B→D→G→H→C→E→I→F

啰嗦一点:从A到B再到D,D有两个子树,从左到右遍历GH,然后转向A的另一个子树C,然后遍历Ed左子树,然而左子树为空,继而遍历I,最后回过头遍历Cd另一个子树F,遍历结束。

2.1.2 前序遍历代码实现
class TreeNode:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None

# 递归
qianxu = []
def PreOrder(root):
    if not root:
        return None
    qianxu.append(root.val)
    PreOrder(root.left)
    PreOrder(root.right)

# 非递归
def Pre_Order(root):
    data = []
    stack = []
    cur = root
    while cur or stack:
        while cur: # 若当前节点不为空
            data.append(cur.val) # 得到当前节点值
            stack.append(cur) # 压入栈中
            cur = cur.left # 去往左子树
        top = stack.pop() # 来到这里,说明当前节点为空,也就是当前节点的父节点无左子树,取出栈顶元素也就是当前节点的父节点
        cur = top.right # 往右子树的方向,若右子树为空则看栈是不是空,若栈不为空,再取出栈顶节点,访问其右子树
    return data

if __name__ == '__main__':
    a1 = TreeNode('A')
    a2 = TreeNode('B')
    a3 = TreeNode('C')
    a4 = TreeNode('D')
    a5 = TreeNode('E')
    a6 = TreeNode('F')
    a7 = TreeNode('G')
    a8 = TreeNode('H')
    a9 = TreeNode('I')
    a1.left = a2
    a1.right = a3
    a2.left 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值