python 实现二叉树

以上为按层次生成的二叉树。

关于二叉树简单的操作包括二叉树节点的定义、二叉树的生成、二叉树的前序遍历、中序遍历、后序遍历。

1.首先关于节点的定义:

"""
 @ python 二叉树及其遍历
 @ author: blackzero
"""
'''
    1. 首先定义树节点的类型
'''
class Node(object):
    # 定义初始化函数
    # val 为节点的值,默认为-1
    # lChild 为节点的左子树,默认为None
    # rChild 为节点的右子树,默认为None
    def __init__(self,val = -1,lChild = None,rChild = None):
        self.val = val
        self.lChild = lChild
        self.rChild = rChild

2. 定义树类型的相关操作:


'''
    2. 定义树的类型
'''
class Tree(object):
    # 定义初始化函数
    # 树为空是,其根节点为一个空节点
    # 这里需要一个辅助队列,协助树的生成
    def __init__(self):
        self.root = Node()
        self.Queue = []

    # 添加子节点,也即生成树,这是一种非常简单的实现形式,按层次生成
    def add(self, val):
        node = Node(val)
        if self.root.val == -1:             # 如果当前的节点的val为-1
            self.root = node                # 则树的root指针指向这个新生成的节点
            self.Queue.append(self.root)    # Queue用来装载树的节点
        else:
            currentNode = self.Queue[0]     # 获取Queue中的第一个元素,也就是当前需要添加左、右子树的节点
            if currentNode.lChild == None:
                currentNode.lChild = node
                self.Queue.append(node)
            else:
                currentNode.rChild = node
                self.Queue.append(node)
                self.Queue.pop(0)   # self.Queue.pop(0)的作用就是把队列Queue中的第一个元素出队列,这样后面的节点就成为要构建子树的根节点

    # 前序遍历
    def preorder_traversal(self,root):
        # 这一句很关键,是递归停止的条件
        if root == None:
            return
        print(root.val)
        self.preorder_traversal(root.lChild)
        self.preorder_traversal(root.rChild)

    # 中序遍历
    def inorder_traversal(self,root):
        if root == None:
            return
        self.inorder_traversal(root.lChild)
        print(root.val)
        self.inorder_traversal(root.rChild)

    # 后序遍历
    def postorder_traversal(self, root):
        if root == None:
            return
        self.postorder_traversal(root.lChild)
        self.postorder_traversal(root.rChild)
        print(root.val)

3. 验证:

if __name__ == '__main__':
    tree = Tree()
    for i in range(10):
        tree.add(i)
    tree.preorder_traversal(tree.root)
    print('*'*15)
    tree.inorder_traversal(tree.root)
    print('*' * 15)
    tree.postorder_traversal(tree.root)

本文仅用递归的方法实现前序、中序、后序遍历,还有循环、栈的方法实现,后续更新。

参考九茶大佬的博客

猜你喜欢

转载自blog.csdn.net/weixin_32087115/article/details/84856643