簡體   English   中英

二進制搜索樹的刪除方法沒有任何作用

[英]remove method for binary search tree does nothing

class BinaryNode:
def __init__(self, value):
    self.data = value
    self.left = None
    self.right = None

def contains(root, value):
    if root is None:
        return False

    if value == root.data:
        return True

    if value < root.data:
        return contains(root.left, value)
    else:
        return contains(root.right, value)


def insert(root, value):
    if root is None:
        root = BinaryNode(value)
    else:
        if value > root.data:
            if root.right is None:
                root.right = BinaryNode(value)
            else:
                return insert(root.right, value)
        else:
            if root.left is None:
                root.left = BinaryNode(value)
            else:
                return insert(root.left, value)

def getMin(root):
    if root.left is None:
        return root.data
    return getMin(root.left)

def remove(root, value, parent = None):
    if root is None:
        return False
    elif value < root.data and root.left is not None:
        return remove(root.left, value, root)
    elif value > root.data and root.right is not None:
        return remove(root.right, value, root)
    else:
        if parent.left is not None and parent.right is None and \
           root.left is None and root.right is None:
               root = None
               parent.left = root



def inorder(root):
    if root is not None:
        inorder(root.left)
        print(root.data)
        inorder(root.right)


b =  BinaryNode(10)
insert(b, 8)
insert(b, 11)

remove(b,11)

inorder(b)

我正在為二進制搜索樹編寫remove函數,我100%肯定這是正確的實現邏輯。 我已經實現了刪除葉節點的最基本情況。 問題必須與python相關嗎? 當我嘗試刪除11時,它仍會按順序遍歷打印。

刪除節點的邏輯缺少必要的步驟。 請在下面的代碼中刪除節點:

def remove(root, value, parent):
    if root is None:
        return False
    elif value < root.data and root.left is not None:
        return remove(root.left, value, root)
    elif value > root.data and root.right is not None:
        return remove(root.right, value, root)
    else:
        if value == root.data:
            if root.right is not None:
                removeRoot = root.right
                while(removeRoot.left is not None):
                    parRoot = removeRoot
                    removeRoot = removeRoot.left
                root.data = removeRoot.data
                parRoot.left = None
                del removeRoot
            elif root.left is not None:
                parent.left = root.left
                del root
            else:
                if parent.right is not None and parent.right.data == root.data:
                    parent.right = None
                elif parent.left is not None:
                    parent.left = None
                del root

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM