[英]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.left
或node.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.left
或node.right
為None
,一個 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.