欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构与算法1:二叉树(binary_tree)的前、中、后序(深度优先)和广度优先遍历及python代码实现

程序员文章站 2022-06-05 12:39:51
...

二叉树的前中后序遍历定义

数据结构与算法1:二叉树(binary_tree)的前、中、后序(深度优先)和广度优先遍历及python代码实现

  1. 树(英语:Tree)是一种无向图(undirected graph),其中任意两个顶点间存在唯一一条路径。或者说,只要没有回路的连通图就是树
  2. 二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)
    的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。
  3. 完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
  4. 平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

对于树的遍历有两大类方法:
5. 深度优先遍历:包括前、中、后序三种遍历;
6. 广度遍历:即我们平常所说的层次遍历(需要其他数据结构的支撑,比如队列)

  1. 前序遍历:根节点---->左子树---->右子树(对于上述图片的树,遍历结果即为:EBADCFHGI)
  2. 中序遍历:左子树---->根节点---->右子树(对于上述图片的树,遍历结果即为:ABCDEFGHI)
  3. 后续遍历:左子树---->右子树---->根节点(对于上述图片的树,遍历结果即为:ACDBGIHFE)
  4. 广度优先遍历:层次遍历,一层一层遍历(对于上述图片的树,遍历结果即为:EBFADHCGI)
    需要注意的是,中序遍历最常用

用递归的方法创建树和遍历树

class Node(object):
    """创建一个构造树的类"""
    def __init__(self, value=None, left=None, right=None):
        super(Node, self).__init__()
        self.value = value
        self.left = left    # 左子树
        self.right = right  # 右子树
def PreOrder(root):
    '''
    前序遍历
    '''
    if root == None:
        return 
    print(root.value)
    PreOrder(root.left)
    PreOrder(root.right)
def InOrder(root):
    '''
    中序遍历
    '''
    if root == None:
        return
    InOrder(root.left)
    print(root.value)
    InOrder(root.right)
def Subsequent(root):
    '''
    后序遍历
    '''
    if root == None:
        return
    Subsequent(root.left)
    Subsequent(root.right)
    print(root.value)
def LevelTraaverse(root):
    '''
    广度优先遍历:层次遍历
    '''
    if root == None:
        return
    queue = []          # 新建一个队列
    queue.append(root)  # 将根节点入队
    while len(queue):   # 只要队列不为空,一直循环
        lenth_q = len(queue)
        for i in range(lenth_q):
            r = queue.pop(0)            # 根节点出队,并存放于r
            if r.left is not None:
                queue.append(r.left)    # 左节点入队
            if r.right is not None:
                queue.append(r.right)   # 右节点入队
            print(r.value) 

main函数:

if __name__=='__main__':
    root=Node('E',left=Node('B',left=Node('A'),right=Node('D',left=Node('C'))), right=Node('F',right=Node('H',left=Node('G'),right=Node('I'))))
    print("PreOrder traversal result:")
    PreOrder(root)
    print("InOrder traversal result:")
    InOrder(root)
    print("Subsequent traversal result:")
    Subsequent(root)
    print("LevelTraaverse result:")
    LevelTraaverse(root)

结果:
数据结构与算法1:二叉树(binary_tree)的前、中、后序(深度优先)和广度优先遍历及python代码实现

参考:
[1]. 深入学习二叉树(一) 二叉树基础
[2]. 二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)