Python学习之二叉树实现的示例详解

 更新时间:2023年04月10日 15:14:03   作者:逃逸的卡路里  
这篇文章主要为大家详细介绍了Python实现二叉树的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下

Python实现二叉树

Python实现二叉树可以使用面向对象编程的方式,通过定义二叉树节点类来实现。每个节点包含一个数据元素、左右子节点指针和一些操作方法,如插入节点、查找节点、删除节点等。

以下是一个简单的二叉树实现示例:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def insert(self, data):
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def find(self, data):
        if data < self.data:
            if self.left is None:
                return str(data) + " Not Found"
            return self.left.find(data)
        elif data > self.data:
            if self.right is None:
                return str(data) + " Not Found"
            return self.right.find(data)
        else:
            return str(self.data) + " is found"

    def inorder_traversal(self, root):
        res = []
        if root:
            res = self.inorder_traversal(root.left)
            res.append(root.data)
            res = res + self.inorder_traversal(root.right)
        return res

在上述代码中,Node类定义了一个节点,包含数据元素data,以及左右子节点指针left和right。insert方法用于向二叉树中插入节点,find方法用于查找二叉树中是否存在特定节点,inorder_traversal方法用于对二叉树进行中序遍历。

下面是如何使用这个Node类来创建一个二叉树:

root = Node(50)
root.insert(30)
root.insert(20)
root.insert(40)
root.insert(70)
root.insert(60)
root.insert(80)

# 查找节点

print(root.find(70)) # Output: 70 is found
print(root.find(90)) # Output: 90 Not Found

# 中序遍历
print(root.inorder_traversal(root)) # Output: [20, 30, 40, 50, 60, 70, 80]

在上述代码中,首先创建了一个根节点root,然后使用insert方法向树中插入节点,最后使用find方法查找节点并使用inorder_traversal方法对二叉树进行中序遍历。

除了插入、查找和遍历方法,二叉树还有其他的操作方法,如删除节点、判断是否为二叉搜索树、计算树的深度等。下面是一个稍微完整一些的二叉树示例代码:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def insert(self, data):
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def find(self, data):
        if data < self.data:
            if self.left is None:
                return None
            return self.left.find(data)
        elif data > self.data:
            if self.right is None:
                return None
            return self.right.find(data)
        else:
            return self

    def delete(self, data):
        if self is None:
            return self

        if data < self.data:
            self.left = self.left.delete(data)
        elif data > self.data:
            self.right = self.right.delete(data)
        else:
            if self.left is None:
                temp = self.right
                self = None
                return temp
            elif self.right is None:
                temp = self.left
                self = None
                return temp
            temp = self.right.minimum()
            self.data = temp.data
            self.right = self.right.delete(temp.data)
        return self

    def minimum(self):
        if self.left is None:
            return self
        return self.left.minimum()

    def is_bst(self):
        if self.left:
            if self.left.data > self.data or not self.left.is_bst():
                return False

        if self.right:
            if self.right.data < self.data or not self.right.is_bst():
                return False

        return True

    def height(self, node):
        if node is None:
            return 0

        left_height = self.height(node.left)
        right_height = self.height(node.right)

        return max(left_height, right_height) + 1

    def inorder_traversal(self, root):
        res = []
        if root:
            res = self.inorder_traversal(root.left)
            res.append(root.data)
            res = res + self.inorder_traversal(root.right)
        return res

在这个示例中,我们新增了delete方法来删除指定的节点;minimum方法来查找树中的最小节点;is_bst方法来判断当前树是否为二叉搜索树;height方法来计算树的深度。

我们可以用以下代码来测试新增的方法:

# 创建二叉树
root = Node(50)
root.insert(30)
root.insert(20)
root.insert(40)
root.insert(70)
root.insert(60)
root.insert(80)

# 删除节点
print("Deleting node 20:")
root.delete(20)
print(root.inorder_traversal(root))

# 判断是否为二叉搜索树
print("Is it a BST?:", root.is_bst())

# 计算树的深度
print("Tree height:", root.height(root))

这样我们就完成了一个比较完整的二叉树的实现,同时也演示了如何在Python中使用面向对象编程思想来实现一个数据结构。

最后附上完整的二叉树类实现代码:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def insert(self, data):
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def find(self, data):
        if data < self.data:
            if self.left is None:
                return None
            return self.left.find(data)
        elif data > self.data:
            if self.right is None:
                return None
            return self.right.find(data)
        else:
            return self

    def delete(self, data):
        if self is None:
            return self

        if data < self.data:
            self.left = self.left.delete(data)
        elif data > self.data:
            self.right = self.right.delete(data)
        else:
            if self.left is None:
                temp = self.right
                self = None
                return temp
            elif self.right is None:
                temp = self.left
                self = None
                return temp
            temp = self.right.minimum()
            self.data = temp.data
            self.right = self.right.delete(temp.data)
        return self

    def minimum(self):
        if self.left is None:
            return self
        return self.left.minimum()

    def is_bst(self):
        if self.left:
            if self.left.data > self.data or not self.left.is_bst():
                return False

        if self.right:
            if self.right.data < self.data or not self.right.is_bst():
                return False

        return True

    def height(self, node):
        if node is None:
            return 0

        left_height = self.height(node.left)
        right_height = self.height(node.right)

        return max(left_height, right_height) + 1

    def inorder_traversal(self, root):
        res = []
        if root:
            res = self.inorder_traversal(root.left)
            res.append(root.data)
            res = res + self.inorder_traversal(root.right)
        return res

if __name__ == '__main__':
    # 创建二叉树
    root = Node(50)
    root.insert(30)
    root.insert(20)
    root.insert(40)
    root.insert(70)
    root.insert(60)
    root.insert(80)

    # 删除节点
    print("Deleting node 20:")
    root.delete(20)
    print(root.inorder_traversal(root))

    # 判断是否为二叉搜索树
    print("Is it a BST?:", root.is_bst())

    # 计算树的深度
    print("Tree height:", root.height(root))

运行代码后,可以得到以下输出:

Deleting node 20:
[30, 40, 50, 60, 70, 80]
Is it a BST?: True
Tree height: 3

这个示例包含了插入、查找、删除、遍历、判断是否为二叉搜索树和计算树的深度等。希望对看到的小伙伴有帮助。

到此这篇关于Python学习之二叉树实现的示例详解的文章就介绍到这了,更多相关Python二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何彻底解决Python中matplotlib不显示中文的问题详解(显示方框)

    如何彻底解决Python中matplotlib不显示中文的问题详解(显示方框)

    Matplotlib绘制图像显示中文的时候,中文会变成小方格子,下面这篇文章主要给大家介绍了关于如何彻底解决Python中matplotlib不显示中文问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • python3 批量获取对应端口服务的实例

    python3 批量获取对应端口服务的实例

    今天小编就为大家分享一篇python3 批量获取对应端口服务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 使用Python实现在Word文档中进行邮件合并

    使用Python实现在Word文档中进行邮件合并

    邮件合并是现代办公中一项显著提升效率的技术,它巧妙地将大量个体数据与预设的文档模板相结合,实现了一次性批量生成定制化文档,下面我们就来看看如何使用Python实现在Word文档中进行邮件合并吧
    2024-04-04
  • Python3中urllib库添加请求头的两种方式

    Python3中urllib库添加请求头的两种方式

    Python 3中的urllib模块可以用来处理URL,包括下载和上传文件、创建和读取cookie、访问Web API等,本文给大家介绍Python3中urllib库添加请求头的两种方式,感兴趣的朋友一起看看吧
    2023-10-10
  • Python+Tkinter打造签名设计工具

    Python+Tkinter打造签名设计工具

    这篇文章主要为大家分享如何利用Python Tkinter库制作带图形界面的一个签名设计工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04
  • 对python过滤器和lambda函数的用法详解

    对python过滤器和lambda函数的用法详解

    今天小编就为大家分享一篇对python过滤器和lambda函数的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 详解如何利用Python代码删除Word文档空白行

    详解如何利用Python代码删除Word文档空白行

    Word文档内容的整洁性与易读性是体现文档水平的关键因素之一,许多错误或不合理的内容,如多余的空白行,Python为批量删除Word文档空白行以及对这一过程的自动化处理提供了强有力的支持,本文将介绍如何利用Python自动化删除Word文档中的空白行,需要的朋友可以参考下
    2024-05-05
  • 在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程

    在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程

    这篇文章主要介绍了在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 四行Python3代码实现图片添加美颜效果

    四行Python3代码实现图片添加美颜效果

    这篇文章主要为大家介绍了如何利用Python语言实现给图片添加美颜效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-04-04
  • Python+selenium实现浏览器基本操作详解

    Python+selenium实现浏览器基本操作详解

    这篇文章主要为大家详细介绍了如何通过python脚本实现浏览器的一些基本操作,如:浏览器的前进后退、页面刷新等,感兴趣的可以学习一下
    2022-06-06

最新评论