搜索二叉树的python实现

我的代码片:https://code.csdn.net/snippets_manage

'''
    功能:在二叉搜索树中查找一个元素,若该元素存在则返回该元素,否则返回该元素若存在时的父母结点
    参数:
         key:结点的键值
         root:二叉树的根节点
'''
def Find(key, root):
    # 若该树为空树或者根节点的键值等于key,则返回根节点
    if root == None or root.key == key:
        return root
    # 若该树非空,且key不等于根节点的键值,则先判读key值对应的结点在root的左子树还是右子树
    # 若key小于root的键值,那么key值对应的结点在root的左子树
    if root.key > key:
        # 若root的左子树存在,递归查找
        if root.left != None:
            return Find(key, root.left)
        # 若root的左子树不存在,key对应的结点不存在,返回root
        return root
    # 若key大于root的键值,在root的右子树中查找key对应的结点
    if root.key < key:
        # 若root的右子树存在,递归查找
        if root.right != None:
            return Find(key, root)
        # 否则直接返回root
        return root


'''
    功能:往书中插入一个结点
    参数:N
'''
def Insert(N):
    # 找出N的父母节点
    M = Find(N)
    # 若N的键值小于M的键值,则N为M的左孩子结点
    if M.key >N.key:
        M.left = N
        N.parent = M
    # 否则N为M的右孩子结点
    else:
        M.right = N
        N.parent = M

'''
    功能:返回大于键值key的最小结点,若key是二叉树中最大的结点,则返回key对应的结点
    参数:
         N:二叉树的某一结点
'''
def Next(N):
    # 如果N有右孩子树,返回N的右孩子树的左孩子叶子结点
    M = Find(max, root)
    if M == N:
        return N
    if N.right != None:
        return LeftDescendant(N.right)
    # 如果N没有右孩子结点,返回N的右父母结点
    if N.right == None:
        return RightAncenstor(N)

def LeftDescendant(N):
    if N.left == None or N == None:
        return N
    return LeftDesendant(N.left)

def RightAncenstor(N):
    if N == N.parent.left:
        return N.parent
    return LeftAncenstor(N.parent)

'''
    功能:删除输入结点
    参数:
         N:要删除的结点
'''

def Delete(N):
    # 若N没有右孩子结点,N的父母结点指向N的左孩子结点
    if N.right == None:
        N.left.parent = N.parent
        # 若N是右孩子结点
        if N.parent.right == N:
            N.prent.right = N.left
            return
        # 若N是左孩子结点
        if N.parent.left == N:
            N.parent.left = N.left
            return
    # 若N有右孩子结点
    else:
        # 查找大于N的最小结点
        x = Next(N)
        # 用x替代N
        N.key = X.key
        # 删除x,由于x一定是左孩子结点
        x.parent.left = None
        return 


'''
    功能:输出键值在x,y之间的一系列结点
    参数:x,y,root
'''
def RangeRearch(x, y, root):
    L = []
    N  = Find(x, root)
    while N != False and N.key <= y:
        if N.key >= x:
            L.append(N)
        N = Next(x)
    return L


'''
    功能:将两棵树合成
    参数:R1,R2(R1中的元素小于R2)
'''
def Merge(R1, R2):
    # 在R1中找出最大的元素,作为合成树的根节点
    R = Find(max, R1)
    # 删除R
    Delete(R)
    # 合成树
    MergeWithRoot(R1, R2, R)
    return R

def MergeWithRoot(R1, R2, R):
    # R1作为R的左子树
    R.left = R1
    R1.parent = R
    # R2作为R的右子树
    R.right = R2
    R2.parent = R
    return R

'''
    功能:将树R分割成两棵树R1和R2(R1的元素均小于x,R2的元素均大于x)
    参数:树的根节点R, 分割的键值
'''
def Split(x, R):
    if R == None:
        return (None, None)
    if R.key >= x:
        (R1, R2) = Split(x, R.left)
        R3 = MergeWithRoot(R2, R.right, R)
        return (R1, R3)
    if x > R.key:
        (R1, R2) = Split(x, R.right)
        R3 = MergeWithRoot(R1, R.left,  R)
        return (R3, R2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值