学习日志018--python实现二叉树

发布于:2024-11-29 ⋅ 阅读:(43) ⋅ 点赞:(0)

class Node:
    def __init__(self,data,l_child = None,r_child=None):
        self.data = data
        self.l_child = l_child
        self.r_child = r_child

class Tree:
    def __init__(self,root = None):
        self.root = root
        self.index = 0

    def tree_create(self,data_str,length):
        if self.index>length:
            return None
        data = data_str[self.index]
        self.index += 1
        if data == "#":
            return None
        node = Node(data)
        node.l_child = self.tree_create(data_str,length)
        node.r_child = self.tree_create(data_str,length)
        return node

    def pir_show(self,node):
        if node is not None:
            print(node.data,end = " ")
            self.pir_show(node.l_child)
            self.pir_show(node.r_child)

    def mid_show(self,node):
        if node is not None:

            self.mid_show(node.l_child)
            print(node.data, end=" ")
            self.mid_show(node.r_child)

    def last_show(self,node):
        if node is not None:

            self.last_show(node.l_child)
            self.last_show(node.r_child)
            print(node.data, end=" ")

if __name__ == "__main__":
    tree = Tree()
    s = input("输入字符串创建二叉树")
    l = len(s)-1
    tree.root = tree.tree_create(s,l)
    tree.pir_show(tree.root)
    print()
    tree.mid_show(tree.root)
    print()
    tree.last_show(tree.root)

 脑图

一、树形结构(层次结构)

1.1 基本概念

树形结构:数据元素之间存在一对多的关系

树:树是由根结点和若干个子结点组成的树形结构

结点:树的基本单位

根结点:没有父结点的节点称为根结点

父结点:当前结点的直接上级节点称为该节点的父结点

孩子结点:当前结点的直接下级节点称为该节点的孩子节点

兄弟节点:拥有相同父结点的结点互为兄弟节点

堂兄弟结点:其父结点在同一层次的结点互为堂兄弟结点

祖先结点:当前结点的直接或间接上级节点

子孙节点:当前结点的直接或间接下级节点

叶子节点:度为0的节点,或者说是没有孩子节点的节点

节点的度:就是该节点的子节点的个数

树的度:当前树中的节点的度的最大值就是树的度

节点的层次:从根结点出发,到该节点处所经历的层次称为该节点的层次

树的层次(深度):节点层次的最大值就是树的层次

森林:由m(m>=0)个不相交的树构成的树形结构叫做森林

1.2 二叉树 

每个节点最多拥有两个子结点,且严格区分左子树和右子树的树形结构。

1.3 二叉树相关概念

1】左子树:以当前节点的左孩子为根节点的子树称为该节点的左子树

2】右子树:以当前节点的右孩子为根节点的子树称为该节点的右子树

3】左斜树:该树上的每个节点都只有左孩子节点,没有右孩子节点的树

4】右斜树:该树上的每个节点都只有右孩子节点,没有左孩子节点的树

5】满二叉树:在不增加层次的基础上,不能再向树上增加节点

6】完全二叉树:在满二叉树的基础上,从左往右依次增加节点的二叉树叫完全二叉树

1.4 二叉树的形态

空树 只有根 根和左子树 根和右子树 根和左子树右子树

1.5二叉树的性质

1.二叉树的第i层上,最多又有2^(i-1)个结点

2.前k层最多拥有2^k-1个节点

3.任意一个二叉树上的叶子节点的数目比度为2的节点的数目多1

1.6二叉树的顺序存储

对于普通二叉树来说,创建顺序存储会造成大量的空间浪费,因此我们暂时不讨论,我们使用链式存储实现二叉树

1.7二叉树的链式存储

如图

1.8二叉树的封装 

从上图我们可以看出一个二叉树的节点包含左孩子链接域,右孩子链接域,以及数据域。

class node:
    def __init__(self,data,l_child = None,r_child=None):
        self.data = data
        self.l_child = l_child
        self.r_child = r_child
        

 除了节点外我们还需要头结点,帮我们找到根的位置,记录二叉树的节点,通过字符串创建二叉树,以及先序,中序,后序方法遍历二叉树。

对于头结点来说,我们不仅需要指向二叉树根的位置,还需要由成员变量index记录输入字符串的大小,默认为0

class Tree:
    def __init__(self,root = None):
        self.root = root
        self.index = 0
        

创建二叉树的实例方法,通过成员变量遍历啊字符串的数据,并通过递归传入子节点数据,返回字节的位置。此外我们还需要判断子节点是否存在根据实例变量index和标识符(这里以#作为空节点的标识符)

    def tree_create(self,data_str,length):
        if self.index>length:
            return None
        data = data_str[self.index]
        self.index += 1
        if data == "#":
            return None
        node = Node(data)
        node.l_child = self.tree_create(data_str)
        node.r_child = self.tree_create(data_str)
        return node

我们这里以先序遍历为例,展示存储结果

    def pir_show(self,node):
        if node is not None:
            print(node.data,end = " ")
            self.pir_show(node.l_child)
            self.pir_show(node.r_child)

    def mid_show(self,node):
        if node is not None:

            self.mid_show(node.l_child)
            print(node.data, end=" ")
            self.mid_show(node.r_child)

    def last_show(self,node):
        if node is not None:

            self.last_show(node.l_child)
            self.last_show(node.r_child)
            print(node.data, end=" ")

执行结果

if __name__ == "__main__":
    tree = Tree()
    s = input("输入字符串创建二叉树")
    l = len(s)-1
    tree.root = tree.tree_create(s,l)
    tree.pir_show(tree.root)
    print()
    tree.mid_show(tree.root)
    print()
    tree.last_show(tree.root)


网站公告

今日签到

点亮在社区的每一天
去签到