簡體   English   中英

在二叉搜索樹中添加節點

[英]adding a node in Binary Search Tree

我目前正在實現二Binary search tree但在創建add_node()函數時遇到問題。 我試圖以遞歸方式實現它,但結果很奇怪。


例如 - 如果我運行add_node(1)add_node(5)add_node(0) ,我的樹只有 1,沒有 5 和 0。

如果你告訴我問題是什么,我會很高興。

def add_node(self, value: int) -> None:
        
    if self.root == None:
        self.root = Node(value)
        return

    else:
        return self.add_recursion(self.root, value)

def add_recursion(self, node: Node, value: int) -> None:
        
    if node == None:
        node = Node(value)
        return

    elif value < node.value:
        return self.add_recursion(node.left, value)

    else:
        return self.add_recursion(node.right, value)

問題是如何處理node.leftnode.right不存在的情況。 由於每次調用都會復制參數,因此在add_recursion設置node的值對樹沒有影響。

def foo(val):
    print("foo start:", val)
    val = 5
    print("foo end:", val)

bar = 3
foo(bar)  # Value of bar is copied for call
print("after foo:", bar) # Prints bar is still 3

我認為您可能還會因為根節點的處理方式而感到困惑。 這是一些關於如何處理對add_recursive的初始調用的入門代碼。

class Node:
    def __init__(self, value: int):
        self.value = value
        self.left = None
        self.right = None

    def add_recursive(self, value: int):
        # TODO: recursively add to left or right
        # For example, here is how you could recursively make a linked list
        if self.right is None:
            self.right = Node(value)
        else:
            self.right.add_recursive(value)

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def add_node(self, value: int):
        if self.root is None:
            self.root = Node(value)
        else:
            # Call add_recursive on root instead of with root.
            self.root.add_recursive(value)

tree = BinarySearchTree()
tree.add_node(1)
tree.add_node(5)
tree.add_node(0)

None值傳遞給函數時,它是按值傳遞的,而不是按引用傳遞,因為……沒有引用。

    elif value < node.value:
        return self.add_recursion(node.left, value)

    else:
        return self.add_recursion(node.right, value)

node.leftnode.rightNone ,一個 Node 最終被創建但不附加到node 所以你可以做的是單獨處理它們None的情況。

def add_recursion(self, node: Node, value: int) -> None:
    if node == None:
        node = Node(value)
    elif value < node.value:
        if node.left == None:
            node.left = Node(value)
        else:
            self.add_recursion(node.left, value)
    else:
        if node.right == None:
            node.right = Node(value)
        else:
            self.add_recursion(node.right, value)

雖然這是可行的,但它變得非常丑陋。 查看 Locke 的答案以了解構建代碼的更好方法。

此外,關於可讀性的額外提示,請避免在不必要的地方使用return ,例如在流程的末尾。

暫無
暫無

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

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