二叉搜索树的基本概念、性质及Python实现

 ———-

二叉搜索树

二叉搜索树相对于普通的二叉树的区别就在于其内部数据额存储是有规律的,任何一个节点其左边的节点小与其根结点数值大小,其右边节点则大与其根结点数值大小。

这样做的意义就在于可以很快地实现查找,判断也很容易进行。在上一篇日志(二叉树的基本性质)中就已经使用了生成二叉搜索树的代码,大家可以参考日志中如何创建二叉树的代码。


元素的查找

  • 利用递归进行查找
def treeSearchx, 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 treeSearchx, 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的父节点,是定义结构体的时候可以确定的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值