Python与数据结构——二叉排序树

今天写二叉排序树

class BTNode:
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right


class BST:
    def __init__(self):
        self.root = None  # 头指针

    def insert(self, data):
        if self.root is None:
            self.root = BTNode(data)
            return True
        pre = None
        node = self.root
        dire = None
        while node is not None:
            pre = node
            if data < node.data:
                dire = "left"
                node = node.left
            elif data > node.data:
                dire = "right"
                node = node.right
            else:
                return False
        if dire == "left":
            pre.left = BTNode(data)
        else:
            pre.right = BTNode(data)
        return True

    @staticmethod
    def __height(node):
        if node is None:
            return 0
        lh = BST.__height(node.left)
        rh = BST.__height(node.right)
        return lh + 1 if lh > rh else rh + 1

    def height(self):
        return self.__height(self.root)

    def remove(self, data): # 上提左子树(左子树存在、左子树不存在)
        if self.root is None:
            return False
        if self.root.data == data:
            left = self.root.left
            right = self.root.right
            if left is not None:
                self.root = left
                if right is not None:
                    while left.right is not None:
                        left = left.right
                    left.right = right
            else:
                self.root = right
            return True
        pre = None
        node = self.root
        dire = None
        while node is not None:
            if data < node.data:
                pre = node
                dire = "left"
                node = node.left
            elif data > node.data:
                pre = node
                dire = "right"
                node = node.right
            else:
                if node.left is not None:
                    if dire == "left":
                        pre.left = node.left
                    else:
                        pre.right = node.left
                    if node.right is not None:
                        left = node.left
                        while left.right is not None:
                            left = left.right
                        left.right = node.right
                else:
                    if dire == "left":
                        pre.left = node.right
                    else:
                        pre.right = node.right
                return True
        return False

    @staticmethod
    def __vlr(node, function):
        if node is None:
            return
        function(node.data)
        if node.left is not None:
            BST.__vlr(node.left, function)
        if node.right is not None:
            BST.__vlr(node.right, function)

    def vlr(self, function):
        self.__vlr(self.root, function)

    @staticmethod
    def __lvr(node, function):
        if node is None:
            return
        if node.left is not None:
            BST.__lvr(node.left, function)
        function(node.data)
        if node.right is not None:
            BST.__lvr(node.right, function)

    def lvr(self, function):
        self.__lvr(self.root, function)

    @staticmethod
    def __lrv(node, function):
        if node is None:
            return
        if node.left is not None:
            BST.__lrv(node.left, function)
        if node.right is not None:
            BST.__lrv(node.right, function)
        function(node.data)

    def lrv(self, function):
        self.__lrv(self.root, function)


if __name__ == "__main__":
    def function(data):
        print(data, end=" ")

    bst = BST()
    bst.insert(9)
    bst.insert(3)
    bst.insert(5)
    bst.insert(13)
    bst.insert(2)
    bst.insert(7)
    bst.insert(4)
    print(bst.height())
    bst.vlr(function)
    print()
    bst.lvr(function)
    print()
    bst.lrv(function)
    print()
    print(bst.remove(5))
    bst.vlr(function)
    print()
    bst.lvr(function)
    print()
    print(bst.remove(9))
    bst.vlr(function)
    print()
    bst.lvr(function)

下面是测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值