二叉搜索树(python)

本文详细介绍了二叉搜索树的基本概念及其操作实现,包括查找、插入、删除等关键方法,并提供了完整的Python实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    二叉搜索树(BST)又称二叉查找树二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。 以上来自百度百科
实现代码如下
#encoding='utf-8'
class Node(object): #结点类
    def __init__(self,data):
        self.data = data
        self.parent = None
        self.lchild = None
        self.rchild = None
class BST(object):
    def __init__(self,node_list):
        self.root = Node(node_list[0])
        for data in node_list[1:]:
            self.insert(data)
    #查找一个具有给定关键字的结点
    def search(self,data):
        while self.root != None and data != self.root.data:
            if data < self.root.data:
                self.root = self.root.lchild
            else:
                self.root = self.root.rchild
        return self.root
    #插入一个具有给定关键字的节点
    def insert(self,data):
        z =  Node(data)
        y = None
        x = self.root
        while x != None:
            y = x
            if z.data < x.data:
                x = x.lchild
            else :
                x = x.rchild
        z.parent = y
        if y == None:
            self.root = z
        elif z.data < y.data:
            y.lchild = z
        else:
            y.rchild = z
    #删除一个结点
    def transplant(self,u,v):
        if u.parent == None:
            self.root = v
        elif u == u.parent.lchild:
            u.parent.lchild = v
        else:
            u.parent.rchild = v
        if v != None:
            v.parent = u.parent
    def delete(self,z):
        if z.lchild == None:
            self.transplant(z,z.rchild)
        elif z.rchild == None:
            self.transplant(z,z.lchild)
        else:
            y = self.mininum(z.rchild)
            if y.parent != z:
                self.transplant(y,y.rchild)
                y.rchild = z.rchild
                y.rchild.parent = y
            self.transplant(z,y)
            y.lchild = z.lchild
            y.lchild.parent = y

    #查找最小关键字
    def mininum(self,x):
        while x.lchild != None:
            x = x.lchild
        return x
    #查找最大关键字
    def maxnum(self,x):
        while x.rchild != None:
            x = x.rchild
        return x
    #后继与前驱
    def successor(self,x):
        if x.rchild != None:
            return self.mininum(x.rchild)
        y = x.parent
        while y != None and x == y.rchild:
            x = y
            y = y.parent
        return y
    #中序遍历
    def inorder_tree_walk(self,x):
        if x != None:
            self.inorder_tree_walk(x.lchild)
            print(x.data)
            self.inorder_tree_walk(x.rchild)

if __name__ == "__main__":
    BST_1 = BST([6,5,7,2,5,8])
    BST_1.inorder_tree_walk(BST_1.root)
    print('')
    BST_1.delete(BST_1.root)
    BST_1.inorder_tree_walk(BST_1.root)

输出结果:

2

5

5

6

7

8

2

5

5

7

8

 如有错误,还望指正!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值