0
点赞
收藏
分享

微信扫一扫

Python数据结构之二叉树——树的变种

千白莫 2022-02-04 阅读 110

Python数据结构之二叉树——树的变种

  1. 二叉树:树的变种,主要节约树在存储时的空间浪费。
  2. 二叉树的公式
    1. 总结点为 n,那么深度就是 2(n)-1。
    2. 深度为n,总结点为 log2(n+1)。
    3. 度为0的节点 n0 = n2+1
    4. 深度在 k 时,最多有 2(k-1) 个元素。
  3. 二叉树的遍历方式
    1. 前序遍历:根左右;
    2. 中序遍历:左根右;
    3. 后序遍历:左右跟;

代码部分

  1. 二叉树节点定义
class Tree_Node:
    def __init__(self, value):
        self.data = value
        self.left_node = None
        self.right_node = None
  1. 二叉树的创建
def Create_Tree(ptr: Tree_Node, value: int):
    new_node = Tree_Node(value=value)
    if not ptr:
        ptr = new_node
        return ptr
    else:
        current = ptr
        while current:
            backup = current
            if current.data > value:
                current = current.left_node
            else:
                current = current.right_node
        if backup.data > value:
            backup.left_node = new_node
        else:
            backup.right_node = new_node
    return ptr
  1. 前序遍历
def preorder(root_ptr):
    if root_ptr:
        print(root_ptr.data, end="\t")
        preorder(root_ptr.left_node)
        preorder(root_ptr.right_node)
  1. 中序遍历
def inorder(root_ptr):
    if root_ptr:
        inorder(root_ptr.left_node)
        print(root_ptr.data, end="\t")
        inorder(root_ptr.right_node)
  1. 后序遍历
def postorder(root_ptr):
    if root_ptr:
        postorder(root_ptr.left_node)
        postorder(root_ptr.right_node)
        print(root_ptr.data, end="\t")
  1. 总结代码
class Tree_Node:
    def __init__(self, value):
        self.data = value
        self.left_node = None
        self.right_node = None


def Create_Tree(ptr: Tree_Node, value: int):
    new_node = Tree_Node(value=value)
    if not ptr:
        ptr = new_node
        return ptr
    else:
        current = ptr
        while current:
            backup = current
            if current.data > value:
                current = current.left_node
            else:
                current = current.right_node
        if backup.data > value:
            backup.left_node = new_node
        else:
            backup.right_node = new_node
    return ptr


def preorder(root_ptr):
    if root_ptr:
        print(root_ptr.data, end="\t")
        preorder(root_ptr.left_node)
        preorder(root_ptr.right_node)


def inorder(root_ptr):
    if root_ptr:
        inorder(root_ptr.left_node)
        print(root_ptr.data, end="\t")
        inorder(root_ptr.right_node)


def postorder(root_ptr):
    if root_ptr:
        postorder(root_ptr.left_node)
        postorder(root_ptr.right_node)
        print(root_ptr.data, end="\t")


if __name__ == '__main__':
    data_array = [6, 3, 5, 4, 7, 8, 9, 2]
    root = None
    for i in range(len(data_array)):
        root = Create_Tree(root, data_array[i])
    print("前序遍历: ")
    preorder(root)
    print("\n中序遍历: ")
    inorder(root)
    print("\n后序遍历: ")
    postorder(root)

"""
数组中的数据:  [0, 6, 3, 5, 4, 7, 8, 9, 2]
数组保存的二叉树数据:  [0, 6, 3, 7, 2, 5, 0, 8, 0, 0, 4, 0, 0, 0, 0, 9]
"""
举报

相关推荐

0 条评论