二叉查找树:Python实现

简介: 二叉查找树,英文Binary Search Tree,也叫二叉排序树,是一种基本的数据结构,简称BST 它支持多种动态集合操作,包括查找(find),最小值(minimum),最大值(maximum),后继(successor),前驱(predecessor),插入(insert),删除(delete),以及中序遍历等。

二叉查找树,英文Binary Search Tree,也叫二叉排序树,是一种基本的数据结构,简称BST

它支持多种动态集合操作,包括查找(find),最小值(minimum),最大值(maximum),后继(successor),前驱(predecessor),插入(insert),删除(delete),以及中序遍历等。它既可以用作字典,也可以用作优先队列。

BST不是稳定的树,极端情况下会退化为线性结构,但平均期望上,insert,delete操作可以为O(lg n),树的期望高度为O(lg n)。

参考了《算法导论》等书,写出了具有insert,delete,find功能的BST,如果有认为不正确的地方欢迎拍砖。

#coding:utf8
#author:HaxtraZ


class BST(object):
    """二叉查找树的简单实现"""
    def __init__(self):
        self.root = None

    def insert(self, val):
        newNode = BSTnode(val)
        if self.root is None:
            self.root = newNode
        else:
            curNode = self.root
            while True:
                if val < curNode.val:
                    #进入左子树
                    if curNode.left is None:
                        curNode.left = newNode
                        newNode.parent = curNode
                        break
                    curNode = curNode.left
                else:
                    #进入右子树
                    if curNode.right is None:
                        curNode.right = newNode
                        newNode.parent = curNode
                        break
                    curNode = curNode.right

    def find(self, val):
        curNode = self.root
        while curNode is not None:
            if val < curNode.val:
                curNode = curNode.left
            elif val > curNode.val:
                curNode = curNode.right
            else:
                return True  # 找到了!

        return False  # 没找到

    def delete(self, val):
        curNode = self.root
        while curNode is not None:
            if val < curNode.val:
                curNode = curNode.left
            elif val > curNode.val:
                curNode = curNode.right
            else:
                # 找到了val
                if curNode.left is not None and curNode.right is not None:
                    target = self.successor(curNode.right).val
                    curNode.val = target.val
                    self.delete(target)
                elif curNode.left is not None:
                    if curNode == self.root:
                        self.root = curNode.left
                    parNode = curNode.parent
                    subNode = curNode.left
                    if parNode.left == curNode:
                        parNode.left = subNode
                    else:
                        parNode.right = subNode
                    subNode.parent = parNode
                else:
                    if curNode == self.root:
                        self.root = curNode.right
                    parNode = curNode.parent
                    subNode = curNode.right
                    if parNode.right == curNode:
                        parNode.right = subNode
                    else:
                        parNode.left = subNode

                return True
        return False  # 不存在val,删除失败

    def minimum(self, node):
        # 返回最小值的节点。其实就是most left one
        curNode = node
        if curNode is None:
            #空树
            return None
        while curNode.left is not None:
            curNode = curNode.left
        return curNode

    def maximum(self, node):
        #返回最大值的节点。其实就是most right one
        curNode = node
        if curNode is None:
            #空树
            return None
        while curNode.right is not None:
            curNode = curNode.right
        return curNode

    def successor(self, node):
        #node是二叉查找树中的一个节点
        #寻找node的后继节点,然后返回
        curNode = node
        if curNode.right is not None:
            #右子树非空,返回右子树最左节点
            return self.minimun(curNode.right)
        else:
            #右子树为空,则返回“最低祖先”
            parNode = curNode.parent
            while parNode is not None and parNode.right == curNode:
                curNode = parNode
                parNode = parNode.parent
            return parNode

    def show(self):
        # 中序遍历
        self.display(self.root)
        print '\n'

    def display(self, node):
        if node is None:
            return
        self.display(node.left)
        print node.val,
        self.display(node.right)

#    def predecessor(self, node):
        # 获取前驱节点。类似于获取后继节点,这里省略。。


class BSTnode(object):
    """二叉查找树的节点类型"""
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None


if __name__ == '__main__':
    mylist = [2, 2, 7, 4, 1, 5]
    bst = BST()
    for i in range(len(mylist)):
        bst.insert(mylist[i])

    bst.show()
    bst.delete(7)
    bst.show()

  

目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
47 4
|
2月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
43 6
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
50 2
|
2月前
|
存储 算法 数据挖掘
高效文本处理新纪元:Python后缀树Suffix Tree,让数据分析更智能!
在大数据时代,高效处理和分析文本信息成为关键挑战。后缀树作为一种高性能的数据结构,通过压缩存储字符串的所有后缀,实现了高效的字符串搜索、最长公共前缀查询等功能,成为文本处理的强大工具。本文探讨Python中后缀树的应用,展示其在文本搜索、重复内容检测、最长公共子串查找、文本压缩及智能推荐系统的潜力,引领数据分析迈入新纪元。虽然Python标准库未直接提供后缀树,但通过第三方库或自定义实现,可轻松利用其强大功能。掌握后缀树,即掌握开启文本数据宝藏的钥匙。
48 5
|
2月前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
在编程领域,高效的数据结构对于解决问题至关重要。本文通过一个案例分析,介绍如何在Python中结合使用Trie树(前缀树)和Suffix Tree(后缀树)。案例聚焦于开发具备高效拼写检查和文本相似度检测功能的文本编辑器。首先,通过构建Trie树快速检查单词是否存在;接着,利用Suffix Tree检测文本相似度。尽管Python标准库未直接提供Suffix Tree,但可通过第三方库或自定义实现。本文展示了高级数据结构在实际应用中的强大功能,并强调了理论与实践相结合的重要性。
37 1
|
2月前
|
存储 算法 Python
逆袭之路:掌握Python字典树Trie与后缀树,成为技术圈的耀眼新星!
在编程的征途上,每个人都渴望成为那个能够独当一面、解决复杂问题的技术高手。而掌握高级数据结构,如字典树(Trie)与后缀树(Suffix Tree),无疑是你逆袭路上的重要一步。这些数据结构不仅能够提升你的编码技能,还能让你在解决特定问题时游刃有余,从而在技术圈中脱颖而出,成为那颗耀眼的新星。
31 1
|
2月前
|
存储 算法 搜索推荐
Python进阶必备:字典树Trie与后缀树Suffix Array,效率提升的神器!
在Python编程中,掌握高效的数据结构对于提升程序性能至关重要。本文将深入探讨两种强大的字符串处理数据结构——字典树(Trie)与后缀数组(Suffix Array)。字典树,又称前缀树,适用于自动补全和拼写检查等功能。例如,在文本编辑器中实现自动补全时,字典树能够即时提供单词补全选项。后缀数组则用于存储字符串的所有后缀并按字典序排序,结合最长公共前缀(LCP)数组,可以高效解决许多字符串问题,如查找最长重复子串等。通过实际案例,我们将展示这两种数据结构的强大功能,帮助你在Python编程中更进一步。
52 2
|
2月前
|
存储 算法 索引
从菜鸟到大神:一文带你彻底搞懂Python中的后缀树Suffix Tree奥秘!
在Python编程中,后缀树是一种高效的数据结构,特别适用于处理复杂的字符串问题,如搜索、最长公共前缀查询及最长重复子串查找等。本文通过问答形式介绍后缀树的基本概念、重要性及其实现方法。后缀树能显著提高字符串处理效率,将传统方法的时间复杂度从O(nm)降至接近O(m)。尽管其构建过程较复杂,但通过手动编写代码或使用第三方库,我们可以在Python中实现这一强大工具。后缀树的应用广泛,涵盖字符串搜索、压缩、生物信息学等多个领域,学习它不仅能帮助解决实际问题,更能提升算法思维和数据结构设计能力。
67 1
|
3月前
|
Python
Python笔下那些神奇的树
Python笔下那些神奇的树
|
3月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。

热门文章

最新文章