【二叉树】用python实现二叉搜索树

本文深入探讨了二叉搜索树的基本概念与实现细节,包括节点插入、查找、删除、遍历等功能,以及最大/小值节点、前驱/后驱节点的查找方法,通过具体代码示例展示了BTS的操作流程。

二叉搜索树(BTS, binary search tree)是满足左子树节点小于根节点、右子树节点大于根节点的二叉树,是B-树的特例,也是AVL的基础。本文实现了BTS的插入、查找、删除、遍历、最大/小值节点、前/驱驱查找等基本功能。

1. 定义树节点类
"""
二叉树由各节点链式构成,节点中保存了键、值、左节点指针、右节点指针、父节点指针等信息。
二叉树的遍历本质上为Node链上的遍历,因此可以利用__iter__和yeild方法实现遍历迭代器。
节点是否为根节点、叶节点或者中间节点(包括父节点和左右节点的情况)对于节点的递归非常重要,所以一并实现。
"""
class TreeNode(object):
    def __init__(self, key, value, left=None, right=None, parent=None):
        self.key = key
        self.value = value
        self.leftChild = left
        self.rightChild =right
        self.parent = parent

    def __iter__(self):
        """
        通过__iter__实现中序遍历递归
        """
        if self:
            if self.hasLeftChild():
                for element in self.leftChild:
                    yield element
            yield self.key
            if self.hasRightChild():
                for element in self.rightChild:
                    yield element

    def hasLeftChild(self):
        return self.leftChild is not None

    def hasRightChild(self):
        return self.rightChild is not None

    def isLeftChild(self):
        return self.parent and self.parent.leftChild == self

    def isRightChild(self):
        return self.parent and self.parent.rightChild == self

    def isRoot(self):
        return not self.parent

    def isLeaf(self):
        return not (self.leftChild or self.rightChild)

    def hasAnyChildren(self):
        return self.leftChild or self.rightChild

    def hasBothChildren(self):
        return self.leftChild and self.rightChild

    def replaceNodeData(self, key, value, lc, rc):
        self.key = key
        self.value = value
        self.leftChild = lc
        self.rightChild = rc
        if self.hasLeftChild():
            self.leftChild.parent = self

        if self.hasRightChild():
            self.rightChild.parent = self
2. 定义BTS类
"""
BTS的初始化和基本方法
"""
class BinarySearchTree(object):
    def __init__(self):
        self.root = None
        self.size = 0

    def __len__(self):
        return self.size
3. 节点插入方法put
class BinarySearchTree(object)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值