python实现二叉树及其基本方法

简介: 什么是二叉树:每个节点最多有两个子树的树结构,通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树具备以下数学性质:在二叉树的第i层上至多有2^(i-1)个结点(i>0)深度为k的二叉树至多有2^k - 1个结点(k>0)...

什么是二叉树:每个节点最多有两个子树的树结构,通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

二叉树具备以下数学性质:

  • 在二叉树的第i层上至多有2^(i-1)个结点(i>0)

  • 深度为k的二叉树至多有2^k - 1个结点(k>0)

  • 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;

  • 具有n个结点的完全二叉树的深度必为 log2(n+1)

  • 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)



两个子概念:

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树

2019-04-11-21_14_47.png

完全二叉树:设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

2019-04-11-21_14_47.png


二叉树的实现

二叉树由两个对象组成,一个是节点对象,一个是树对象

class Node:
    """节点类"""
    def __init__(self, elem, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild


class Tree:
    """树类"""
    def __init__(self, root=None):
        self.root = root


接下来给这树添加基本方法:增加节点

class Node:
    """节点类"""
    def __init__(self, elem, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild


class Tree:
    """树类"""
    def __init__(self, root=None):
        self._root = root

    def add(self, item):
        node = Node(item)
        if not self._root:
            self._root = node
            return
        queue = [self._root]
        while queue:
            cur = queue.pop(0)
            if not cur.lchild:
                cur.lchild = node
                return
            elif not cur.rchild:
                cur.rchild = node
                return
            else:
                queue.append(cur.rchild)
                queue.append(cur.lchild)


对二叉树节点的操作是通过列表存储节点的形式来操作,但是二叉树数据本身是通过链表的形式来存储,节点的操作一般使用递归函数。

二叉树的遍历又分为深度遍历和广度遍历,深度遍历还要分中序遍历/先序遍历/后序遍历,将在下一篇来给二叉树增加遍历方法。

2019-04-11-21_14_48.png

相关文章
|
10天前
|
Python
python简单分割文件的方法(python经典案例)
这篇文章介绍了两种使用Python进行文件分割的方法:通过读取指定字节数分割大文件成小文件,以及通过行数将文本文件分割成多个小文件。
30 1
|
8天前
|
移动开发 Python Windows
python编程获取网页标题title的几种方法及效果对比(源代码)
python编程获取网页标题title的几种方法及效果对比(源代码)
|
7天前
|
Python
python方法,传参20220101 计算与当前时间差
python方法,传参20220101 计算与当前时间差
|
8天前
|
缓存 开发者 Python
Python指定行号读取文件的方法
这种方法的优势在于它的效率和简便性,特别是当需要从同一文件中读取多行时。`linecache`会缓存文件,减少了重复读取的开销。
15 4
|
10天前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
37 4
|
7天前
|
存储 Python
Python中类方法、实例方法与静态方法的区别
这三种方法的正确使用可以使代码更加清晰、组织良好并且易于理解,从而有效地支持软件开发的面向对象编程范式。
10 1
|
9天前
|
Python
Python中的push方法详解与实例
Python中的push方法详解与实例
11 3
|
10天前
|
API 开发者 Python
Python中的魔法方法:从原理到实践
【9月更文挑战第24天】本文将深入探讨Python的魔法方法,这些特殊的方法允许对象定制其行为。文章首先揭示魔法方法的本质和重要性,然后通过代码示例展示如何利用它们来增强类的功能性。最后,我们将讨论在实际应用中应注意的事项,以确保正确和高效地使用这些方法。
|
10天前
|
Python
python 类中的内置方法
python 类中的内置方法
|
15天前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
下一篇
无影云桌面