搜索二叉树的python实现

来源:互联网 发布:黄思路韩寒 知乎 编辑:程序博客网 时间:2024/06/04 19:11

我的代码片: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 Rdef 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