———-
二叉搜索树
二叉搜索树相对于普通的二叉树的区别就在于其内部数据额存储是有规律的,任何一个节点其左边的节点小与其根结点数值大小,其右边节点则大与其根结点数值大小。
这样做的意义就在于可以很快地实现查找,判断也很容易进行。在上一篇日志(二叉树的基本性质)中就已经使用了生成二叉搜索树的代码,大家可以参考日志中如何创建二叉树的代码。
元素的查找
- 利用递归进行查找
def treeSearch(x, k):
if x == None or k = x.data:
return x
elif k < x.data:
return treeSearch(x.left, k)
else:
return treeSearch(x.right, k)
- 非递归的查找
def treeSearch(x, k):
while x != None and k != x.data:
if k < x.data:
x = x.left
elif k > x.data:
x = x.right
else:
return x
元素的插入
元素的插入请参考二叉树的性质那篇文章中的insert函数,直接调用即可插入元素。
元素的删除
删除元素共有如下三种情况:
- 若删除的元素刚好是叶子节点,就直接删除元素,然后把该结点用None来代替。
- 若删除的元素只有一个孩子节点,那么就把这个节点删除再将其孩子节点变成现在的节点。
- 若删除的元素有两个孩子,那么需要判断的情况就稍微复杂一点,需要从该元素的右孩子树中找到一个合适的元素(称为后继)来代替该元素,原来的右子树变为当前更新元素的右子树。
def treeDelete(Tree, z):
if z.left is None:
transplant(Tree, z, z.right)
elif z.right is None:
transplant(Tree, z, z.left)
else:
y = treeMaximum(z.right)
if y.p is not z:
transplant(Tree, y, y.right)
y.right.p = y
transplant(Tree, z, y)
y.left = z.left
y.left.p = y
#定义transplant函数,函数用在将一棵树的子树换为另一个子树
def transplant(Tree, u, v):
if u.p is None:
Tree.root = v
elif u == u.p.left
u.p.left = v
else:
u.p.right = v
if v is not None:
v.p = u.p
# 再定义上述使用过的最大元素的求解函数,就是找到最右边的元素。
def treeMaximum(x)
while x.right is not None:
x = x.right
return x
# 其中上面的函数还涉及到x.p指的是x的父节点,是定义结构体的时候可以确定的。