首页 > 编程语言 > 详细

二叉搜索树-增删查Python

时间:2021-04-30 15:30:16      阅读:19      评论:0      收藏:0      [点我收藏+]
# 二叉搜索树又名有序二叉树,节点元素按特定次序排布,使得我们可以在查找等操作中使用二分查找提高效率
# 特点:父节点的值大于左子树任意节点的值,小于右子树任意节点的值
class BinarySearchTree(object):
    def __init__(self, item):
        self.item = item
        self.left = None
        self.right = None

    def insert_node(self, value):
        # 插入节点
        if value <= self.item and self.left:
            self.left.insert_node(value)
        elif value <= self.item:
            self.left = BinarySearchTree(value)
        elif value > self.item and self.right:
            self.right.insert_node(value)
        else:
            self.right = BinarySearchTree(value)

    def remove_node(self, value, parent):
        # 删除节点 情况1.叶子节点;情况2.只有左孩子或又孩子;情况3.同时有左右孩子
        if value < self.item and self.left:
            return self.remove_node(value, self)
        elif value < self.item:
            return False
        elif value > self.item and self.right:
            return self.remove_node(value, self)
        elif value > self.item:
            return False
        else:
            # 叶子节点
            if self.left is None and self.right is None and self == parent.left:
                parent.left = None
                self.clear_node()
            elif self.right is None and self.right is None and self == parent.right:
                parent.right = None
                self.clear_node()
            elif self.left and self.right is None and self == parent.left:
                parent.left = self.left
                self.clear_node()
            elif self.left and self.right is None and self == parent.right:
                parent.right =  self.left
                self.clear_node()
            elif self.right and self.left is None and self == parent.left:
                parent.left = self.right
                self.remove_node()
            elif self.right and self.left is None and self == parent.right:
                parent.right = self.right
                self.remove_node()
            else:
                # 将右子树最小值放到该节点
                self.value = self.right.find_minimum_value()
                self.right.clear_node(self.value, self)


    def find_node(self, value):
        # 查找某一节点
        if value < self.item and self.left:
            return self.left.find_node(value)
        if value > self.item and self.right:
            return self.right.find_node(value)
        return value == self.item

    def find_minimum_value(self):
        # 找到最小值
        if self.left:
            return self.left.find_minimum_value()
        else:
            return self.item

    def clear_node(self):
        # 节点清零
        self.item = None
        self.left = None
        self.right = None


if __name__ == __main__:
    root = BinarySearchTree(50)
    root.insert_node(76)
    root.insert_node(21)
    root.insert_node(4)
    root.insert_node(32)
    root.insert_node(100)
    root.insert_node(64)
    root.insert_node(52)

    print(root.find_node(1000))
    print(root.find_minimum_value())

 

二叉搜索树-增删查Python

原文:https://www.cnblogs.com/demo-deng/p/14721154.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!