Python之AVL树

简介: 笔记

AVL树(平衡二叉树)


1.png

#节点类。AVL树相对一般二叉搜索树,节点增加树高属性,便于判断是否平衡,从而决定是否进行调整等。
class Node:
    def __init__(self, data = -1, height = 1, left = None, right = None):
        self.data = data
        self.left = left
        self.right = right
        self.height = height
    def __str__(self):
        return str(self.data)
class AVLTree:
    def __init__(self, root=None):
        self.root = root
    # 增加一些公有私有机制
    def find(self, data):
        if self.root == None:
            return None
        return self.__find(self.root, data)
    def __find(self, root, data):
        if root == None:
            return None
        if root.data == data:
            return root
        elif root.data < data:
            return self.__find(root.right, data)
        else:
            return self.__find(root.left, data)
    def height(self):
        if self.root == None:
            return 0
        return self.root.height
    def __update(self, root):
        root.height = 1
        if root.left != None:
            root.height = max(root.height, root.left.height + 1)
        if root.right != None:
            root.height = max(root.height, root.right.height + 1)
    def __left_rotate(self, root):
        tmp = root.right
        root.right = tmp.left
        tmp.left = root
        self.__update(root)
        self.__update(tmp)
        return tmp
    def __right_rotate(self, root):
        tmp = root.left
        root.left = tmp.right
        tmp.right = root
        self.__update(root)
        self.__update(tmp)
        return tmp
    def get_pre(self, root):
        tmp = root.left
        while tmp.right != None:
            tmp = tmp.right
        return tmp
    def insert(self, data):
        self.root = self.__insert(self.root, data)
    def __insert(self, root, data):
        if root == None:
            return Node(data)
        if root.data == data:
            return root
        if root.data < data:
            root.right = self.__insert(root.right, data)
        else:
            root.left = self.__insert(root.left, data)
        self.__update(root)
        return self.__maintain(root)
    def delete(self, data):
        self.root = self.__delete(self.root, data)
    def __delete(self, root, data):
        if root == None:
            return root
        if root.data < data:
            root.right = self.__delete(root.right, data)
        elif root.data > data:
            root.left = self.__delete(root.left, data)
        else:
            if root.left == None or root.right == None:
                tmp = root.left if root.left != None else root.right
                del root
                return tmp
            tmp = self.get_pre(root)
            root.data = tmp.data
            root.left = self.__delete(root.left, tmp.data)
        self.__update(root)
        return self.__maintain(root)
    def __maintain(self, root):
        left_h = root.left.height if root.left != None else 0
        right_h = root.right.height if root.right != None else 0
        if abs(left_h - right_h) <= 1:
            return root
        if left_h > right_h:
            lright_h = root.left.right.height if root.left.right != None else 0
            lleft_h = root.left.left.height if root.left.left != None else 0
            if lright_h > lleft_h:
                root.left = self.__left_rotate(root.left)
            root = self.__right_rotate(root)
        else:
            rleft_h = root.right.left.height if root.right.left != None else 0
            rright_h = root.right.right.height if root.right.right != None else 0
            if rleft_h > rright_h:
                root.right = self.__right_rotate(root.right)
            root = self.__left_rotate(root)
        return root
    def inorder(self, root):
        if root is None:
            return []
        res = [root.data]
        left_res = self.inorder(root.left)
        right_res = self.inorder(root.right)
        return left_res + res + right_res

测试代码:

t = AVLTree()
def printf():
    res = t.inorder(t.root)
    for i in res:
        print("{0}:({1}, {2})".format(t.find(i), t.find(i).left, t.find(i).right))
    print("root =", t.root, "h =", t.height())
    print()
for i in range(1, 10):
    t.insert(i)
    printf()

总结


这里的写法有点臃肿,主要是对于不存在的节点None,取不到height属性。所以对此需要if特判,取得默认None情况的height为0值。


然后就是平衡二叉树,基操就是进行旋转,回溯过程中,哪个地方不平衡了就立即调整,其它都同正常的BST。


还有一点就是写法问题,这次是用了_+name的形式书写方法名,化作私有方法,简而言之就是进行了多一层的封装,对外接口更加方便。对比上一个BST,我将节点的增删改查等方法以静态方法的形式,封装在Node类中,应该是各有优势吧。(不是


下一篇进攻红黑树,对问题一的写法会有一个优化。话说就是这脑瘫的写法,搞得我debug半个钟。(节点树高的维护出错了,原因是__update() 方法中没加赋值那条语句)



相关文章
|
6月前
|
算法 Java Python
使用Python来绘制樱花树
本文以林徽因的《你是人间的四月天》为引,将春日意象与现代职场编程艺术结合,通过Python的Turtle模块绘制分形树和花瓣图案。文章详细解析了Turtle模块的使用方法、递归算法及随机性在图形生成中的应用,展示了如何用代码创造自然美感。核心代码包含tree函数(绘制分形树)和petal函数(绘制花瓣),最终生成一幅生动的春日画卷。项目不仅帮助读者掌握Turtle绘图技巧,更激发对编程艺术的兴趣,鼓励探索数字世界的无限可能。
163 5
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
159 4
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
171 6
|
存储 算法 数据挖掘
高效文本处理新纪元:Python后缀树Suffix Tree,让数据分析更智能!
在大数据时代,高效处理和分析文本信息成为关键挑战。后缀树作为一种高性能的数据结构,通过压缩存储字符串的所有后缀,实现了高效的字符串搜索、最长公共前缀查询等功能,成为文本处理的强大工具。本文探讨Python中后缀树的应用,展示其在文本搜索、重复内容检测、最长公共子串查找、文本压缩及智能推荐系统的潜力,引领数据分析迈入新纪元。虽然Python标准库未直接提供后缀树,但通过第三方库或自定义实现,可轻松利用其强大功能。掌握后缀树,即掌握开启文本数据宝藏的钥匙。
156 5
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
253 2
|
存储 算法 搜索推荐
Python进阶必备:字典树Trie与后缀树Suffix Array,效率提升的神器!
在Python编程中,掌握高效的数据结构对于提升程序性能至关重要。本文将深入探讨两种强大的字符串处理数据结构——字典树(Trie)与后缀数组(Suffix Array)。字典树,又称前缀树,适用于自动补全和拼写检查等功能。例如,在文本编辑器中实现自动补全时,字典树能够即时提供单词补全选项。后缀数组则用于存储字符串的所有后缀并按字典序排序,结合最长公共前缀(LCP)数组,可以高效解决许多字符串问题,如查找最长重复子串等。通过实际案例,我们将展示这两种数据结构的强大功能,帮助你在Python编程中更进一步。
234 2
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
在编程领域,高效的数据结构对于解决问题至关重要。本文通过一个案例分析,介绍如何在Python中结合使用Trie树(前缀树)和Suffix Tree(后缀树)。案例聚焦于开发具备高效拼写检查和文本相似度检测功能的文本编辑器。首先,通过构建Trie树快速检查单词是否存在;接着,利用Suffix Tree检测文本相似度。尽管Python标准库未直接提供Suffix Tree,但可通过第三方库或自定义实现。本文展示了高级数据结构在实际应用中的强大功能,并强调了理论与实践相结合的重要性。
166 1
|
存储 算法 Python
逆袭之路:掌握Python字典树Trie与后缀树,成为技术圈的耀眼新星!
在编程的征途上,每个人都渴望成为那个能够独当一面、解决复杂问题的技术高手。而掌握高级数据结构,如字典树(Trie)与后缀树(Suffix Tree),无疑是你逆袭路上的重要一步。这些数据结构不仅能够提升你的编码技能,还能让你在解决特定问题时游刃有余,从而在技术圈中脱颖而出,成为那颗耀眼的新星。
118 1
|
存储 算法 索引
从菜鸟到大神:一文带你彻底搞懂Python中的后缀树Suffix Tree奥秘!
在Python编程中,后缀树是一种高效的数据结构,特别适用于处理复杂的字符串问题,如搜索、最长公共前缀查询及最长重复子串查找等。本文通过问答形式介绍后缀树的基本概念、重要性及其实现方法。后缀树能显著提高字符串处理效率,将传统方法的时间复杂度从O(nm)降至接近O(m)。尽管其构建过程较复杂,但通过手动编写代码或使用第三方库,我们可以在Python中实现这一强大工具。后缀树的应用广泛,涵盖字符串搜索、压缩、生物信息学等多个领域,学习它不仅能帮助解决实际问题,更能提升算法思维和数据结构设计能力。
321 1
|
Python
Python笔下那些神奇的树
Python笔下那些神奇的树
88 1

热门文章

最新文章

推荐镜像

更多