python3 数据结构和算法(3) 二叉搜索树

48 篇文章 0 订阅
import random
import time
from functools import wraps

def timethis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - start
        print('%-30s %10s %f' % (func.__name__, ' cost time:', elapsed))
        return result
    return wrapper

class BSTNode():
    def __init__(self, k):
        self.key = k
        self.left = None
        self.right = None
        self.parent = None

    def __str__(self):
        return str(self.key)

class BinarySearchTree():
    def __init__(self):
        self.root = None

    def insert(self, k):
        n = BSTNode(k)
        current = self.root
        parent = None

        while current:
            parent = current
            if k < current.key:
                current = current.left
            else:
                current = current.right

        n.parent = parent
        if not parent:
            self.root = n
        else:
            if k < parent.key:
                parent.left = n
            else:
                parent.right = n

    def inorder_rec(self, node, keys):
        if node:
            self.inorder_rec(node.left, keys)
            keys.append(node.key)
            self.inorder_rec(node.right, keys)

    def inorder(self):
        keys = []
        self.inorder_rec(self.root, keys)
        return keys

    def search(self, k):
        p = self.root
        while p and p.key != k:
            if k < p.key:
                p = p.left
            else:
                p = p.right
        return p

    def minimum(self, node):
        while node.left:
            node = node.left
        return node

    def successor(self, node):
        if node.right:
            return self.minimum(node.right)

        p = node.parent
        while p and node == p.right:
            node = p
            p = p.parent
        return p

    def delete(self, node):
        x = y = None
        if node.left is None or node.right is None:
            y = node
        else:
            y = self.successor(node)

        if y.left is not None:
            x = y.left
        else:
            x = y.right

        if x is not None:
            x.parent = y.parent

        if y.parent is None:
            self.root = x
        else:
            if y == y.parent.left:
                y.parent.left = x
            else:
                y.parent.right = x

        if y != node:
            node.key = y.key


def test_insert(bst):
    for i in range(100):
        k = random.randint(1, 1000)
        if bst.search(k) is None:
            bst.insert(k)

    keys = bst.inorder()
    print(keys)
    s = sorted(keys)
    if s != keys:
        print('error')

def test_search(bst):
    for i in range(10):
        k = random.randint(1, 1000)
        node = bst.search(k)
        if node:
            print(k, 'in tree', node.key)
        else:
            print(k, 'not in tree')

    keys = bst.inorder()
    for i in range(10):
        k = keys[i]
        node = bst.search(k)
        if node:
            print(k, 'in tree', node.key)
        else:
            print(k, 'not in tree')

def test_delete(bst):
    deleted = 0
    while deleted < 10:
        k = random.randint(1, 1000)
        node = bst.search(k)
        if node:
            print('delete node', k)
            bst.delete(node)
            node = bst.search(k)
            if node:
                print('error, should not in tree any more')
                return

            keys = bst.inorder()
            s = sorted(keys)
            if s != keys:
                print('error not sorted after delete node')
            deleted += 1

    # delete all
    keys = bst.inorder()
    for i in range(len(keys)):
        j = random.randint(0, len(keys)-1)
        k = keys[j]
        node = bst.search(k)
        if not node:
            print('error, should in tree')
            return

        print('delete node', k)
        bst.delete(node)
        node = bst.search(k)
        if node:
            print('error, should not in tree any more')
            return

        keys = bst.inorder()
        s = sorted(keys)
        if s != keys:
            print('error not sorted after delete node')


def main():
    bst = BinarySearchTree()
    test_insert(bst)
    test_search(bst)
    test_delete(bst)


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构算法(Python) 一、引入概念 1-01算法引入 1-02 时间复杂度与大O表示法 1-03-最坏时间复杂度与计算规则 1-04-常见时间复杂度与大小关系 1-05-代码执行时间测量模块 1-06-Python列表类型不同操作的时间效率 1-07-Python列表与字典操作的时间复杂度 1-08-数据结构引入 二、顺序表 2-01 内存、类型本质、连续存储 recv 2-02 基本顺序表与元素外围顺序表 recv 2-03 顺序表的一体式结构与分离式结构 recv 2-04 顺序表数据区替换与扩充 recv 三、栈 3-01 栈与队列的概念 3-02 栈的实现 3-03 队列与双端队列的实现 四、链表 4-01 链表的提出 4-02 单链表的ADT模型 4-03 Python中变量标识的本质 4-04 单链表及结点的定义代码 4-05 单链表的判空、长度、遍历与尾部添加结点的代码实现 4-06 单链表尾部添加和在指定位置添加 4-07 单链表查找和删除元素 4-08 单链表与顺序表的对比 4-09 单向循环链表遍历和求长度 4-10 单向循环链表添加元素 4-11 单向循环链表删除元素 4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入排序 5-06 插入排序2 5-07 希尔排序 5-08 希尔排序实现 5-09 快速排序 5-10 快速排序实现1 (1) 5-10 快速排序实现1 5-11 快速排序实现2 5-12 归并排序 5-13 归并排序 代码执行流程 5-14 归并排序时间复杂度及排序算法复杂度对比 5-15 二分查找 5-16 二分查找时间复杂度 六、树和树的算法 6-01 树的概念 6-02 二叉树的概念 6-03 二叉树的广度优先遍历 6-04 二叉树的实现 6-05 二叉树的先序、中序、后序遍历 6-06 二叉树由遍历确定一棵树 ———————————————— 版权声明:本文为CSDN博主「dwf1354046363」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dwf1354046363/article/details/119832814
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值