二叉树的增删改查(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 删操作
删除操作复杂一些,根据子节点的个数,需要考虑如下三种情况:
-
如果目标节点没有子节点,可直接移除该目标节点,设为 None
。 -
如果目标节只有一个子节点,可用其子节点作为替换。 -
如果目标节点有两个子节点,有两种方案,寻找目标节点右子树的最小值或左子树的最大值节点,根据最值节点创建临时节点,然后用临时节点替换目标节点,最后删除最值节点。
代码如下:
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(None, 5) # 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, 100, 5) # root is empty !
root = modify(root, 10, 100)
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