python 二叉树 层级遍历 前序遍历 中序遍历 后续遍历 简单使用

"""
二叉树
author : zhao
"""
class Node():
    """
    节点类, 二叉树可以看成由无数个节点组成
    """
    def __init__(self, x=-1):
        self.val = x
        self.left = None
        self.right = None

class Tree():
    """
    树类,主要定义一些方法
    """
    def __init__(self):
        """ 初始化 定义一个根节点 """
        self.root = Node()

    def add(self, data):
        """ 定义添加二叉树结点方法 切记 add() 函数为添加结点的函数 """
        """ 数据初始化 不要看别的函数  """
        node = Node(data)
        """ 上面定义的-1 表示空 这样才可以向树中诸如元素 """
        if self.root.val == -1:
            self.root = node
        else:
            """ 声明存放结点的列表 每次向二叉树添加节点 都会将二叉树遍历一遍 """
            q = []
            q.append(self.root)
            while q:
                s = q.pop(0)
                """ 判断 结点的左右子树是否为空 为空 则将 新添加的元素 赋值到子树上 """
                if not s.left:
                    s.left = node
                    return
                elif not s.right:
                    s.right = node
                    return
                else:
                    """ 如果都不会空 就会添加到q 列表中 将其下一次遍历 下一次遍历 s.left 和 s.right 会被看成 根"""
                    q.append(s.left)
                    q.append(s.right)


    def sort_recusion(self, root):
        """ 层级遍历 root 为传入的树 """
        """ 先判断根节点是否为空 为空则返回 """
        if root == None:
            return
        q= []
        q.append(root)
        while q:
            s = q.pop(0)
            """ 首先打印每一个个元素 在依次判断每一个结点是否有 左子树和 右子树 有的话 加入列表 用作下一次打印 
            没有则进行下一次循环
            """
            print(s.val, end=', ')
            """ 当s.left 和 s.right 存在的时候 才会将其放入列表中 当作下一次根节点的打印 """
            if s.left:
                q.append(s.left)
            if s.right:
                q.append(s.right)


    def pre_recusion(self, root):
        """  递归实现 前序遍历 """
        """ 每次调用首先 打印根节点 然后先将左子树出入递归函数 当作下一次打印的根节点 """
        if root == None:
            return
        print(root.val, end=', ')
        self.pre_recusion(root.left)
        self.pre_recusion(root.right)

    def mid_recusion(self, root):
        """ 递归实现 中序遍历"""
        """ 每次先将左子树传入递归函数 用作下一次根节点打印 然后在进行打印当前根节点 """
        if root == None:
            return
        self.mid_recusion(root.left)
        print(root.val, end=', ')
        self.mid_recusion(root.right)


    def suf_recusion(self, root):
        """ 递归实现 后序遍历 """
        """ 每一次先将 左子树 右子树 传入递归函数 这样程序就会先去将当前左子树 作为下一次打印的根节点 右子树道理相同 最后打印当前根节点"""
        if root == None:
            return
        self.suf_recusion(root.left)
        self.suf_recusion(root.right)
        print(root.val, end=', ')

if __name__ == "__main__":
    t = Tree()
    """ 调用add() 向二叉树添加结点 """
    for i in range(10):
        t.add(i)
print("层级遍历 %s" % t.sort_recusion(t.root)) print("前序遍历 %s" % t.pre_recusion(t.root)) print("中序遍历 %s" % t.mid_recusion(t.root)) print("后序遍历 %s" % t.suf_recusion(t.root))

结果:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 层级遍历 None
0, 1, 3, 7, 8, 4, 9, 2, 5, 6, 前序遍历 None
7, 3, 8, 1, 9, 4, 0, 5, 2, 6, 中序遍历 None
7, 8, 3, 9, 4, 1, 5, 6, 2, 0, 后序遍历 None
邮箱: 1090055252@qq.com
原文地址:https://www.cnblogs.com/zhaoxianxin/p/13267946.html