vlambda博客
学习文章列表

二叉树的增删改查(Python)


1 二叉树的定义

二叉搜索树的定义:二叉搜索树(BST)是二叉树的一种特殊表示形式,它满足如下特性:

  • 每个节点中的值必须 大于(或等于)存储在其 左侧子树中的任何值。
  • 每个节点中的值必须 小于(或等于)存储在其 右子树中的任何值。

下面是一个二叉搜索树的例子:

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

2 增操作

增加操作本质上与操作并无区别。

代码如下:

def insert(root, val):
    """二叉树添加"""
    if root:
        if root.val < val:
            root.right = insert(root.right, val)
        elif root.val > val:
            root.left = insert(root.left, val)
    else:
        root = Node(val)
    return root

测试如下:

root = None
root = insert(root, 5)
root = insert(root, 10)
root = insert(root, 3)

print(root.val)  # 5
print(root.left.val)  # 3
print(root.right.val)  # 10

3 删操作

删除操作复杂一些,根据子节点的个数,需要考虑如下三种情况:

  1. 如果目标节点没有子节点,可直接移除该目标节点,设为 None
  2. 如果目标节只有一个子节点,可用其子节点作为替换。
  3. 如果目标节点有两个子节点,有两种方案,寻找目标节点右子树的最小值或左子树的最大值节点,根据最值节点创建临时节点,然后用临时节点替换目标节点,最后删除最值节点。

代码如下:

def delete(root, val):
    """二叉树删除"""
    if root:
        if root.val == val:
            if not root.right and not root.left:
                return None
            elif root.left and not root.right:  # 只含左节点
                root = root.left
            elif not root.left and root.right:
                root = root.right
            else:
                temp = minimum(root.right)
                root.val = temp.val
                root.right = delete(root.right, root.val)
        elif root.val > val:
            root.left = delete(root.left, val)
        elif root.val < val:
            root.right = delete(root.right, val)
    else:
        print('root is empty ! ')
    return root

def minimum(root):
    if root:
        while root.left:
            root = root.left
    return root

def maximum(root):
    if root:
        while root.right:
            root = root.right
    return root

测试如下:

delete(None5)  # root is empty !
root = delete(root, 5)
print(root.val)  # 10

4 改操作

这里的修改操作仅仅对结点值进行了修改,修改完以后并没有维护二叉搜索树的性质,后续还可以进一步改进。

代码如下:

def modify(root, val, newval):
    """二叉树修改"""
    if root:
        if root.val > val:
            root = modify(root.left, val, newval)
        elif root.val < val:
            root = modify(root.right, val, newval)
        else:
            root.val = newval
    else:
        print('root is empty !')
    return root

测试如下:

modify(root, 1005)  # root is empty !
root = modify(root, 10100)
print(root.val)  # 100

5 查操作

代码如下:

def search(root, val):
    """二叉树查找"""
    if root:
        if root.val > val:
            return search(root.left, val)
        elif root.val < val:
            return search(root.right, val)
        else:
            print('find the value!')
    else:
        print(f'the tree donnot have {val}')

测试如下:

search(root, 30# the tree donnot have 30
search(root, 3)  # find the value!

参考:

【1】http://t.zoukankan.com/zuoyuan-p-3791801.html

【2】https://blog.csdn.net/qq_43762574/article/details/107208354