[英]RecursionError: maximum recursion depth exceeded - Binary Tree
在為二叉樹實現add_node
和search
方法時,我得到一個 RecursionError: maximum recursion depth exceeded
代碼:
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self, root=None):
self.root = root
def add_node(self, node, value):
node = self.root
if node is not None:
if not node.value:
node.value = value
elif not node.left:
node.left = value
elif not node.right:
node.right = value
else:
node.left = self.add_node(node.left, value)
else:
self.root = TreeNode(value)
def search(self, value):
node = self.root
found = False
while node is not None:
if node.value == value:
found = True
if node.left:
found = node.left.search(value)
if node.right:
found = found or node.left.search(value)
return found
def main():
binary_tree = BinaryTree()
binary_tree.add_node(binary_tree.root, 200)
binary_tree.add_node(binary_tree.root, 300)
binary_tree.add_node(binary_tree.root, 100)
binary_tree.add_node(binary_tree.root, 30)
binary_tree.traverse_inorder(binary_tree.root)
print(binary_tree.search(200))
if __name__ == '__main__':
main()
錯誤:
Traceback (most recent call last):
File ".\binary_tree_test20.py", line 51, in <module>
main()
File ".\binary_tree_test20.py", line 45, in main
binary_tree.add_node(binary_tree.root, 30)
File ".\binary_tree_test20.py", line 22, in add_node
node.left = self.add_node(node.left, value)
File ".\binary_tree_test20.py", line 22, in add_node
node.left = self.add_node(node.left, value)
File ".\binary_tree_test20.py", line 22, in add_node
node.left = self.add_node(node.left, value)
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
這是我可以給你的補救措施。
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def _add_node(node, value):
if not node.value:
node.value = value
elif not node.left:
node.left = TreeNode(value)
elif not node.right:
node.right = TreeNode(value)
else:
_add_node(node.left, value)
class BinaryTree:
# ...
def add_node(self, value):
node = self.root
if node is not None:
_add_node(node, value)
else:
self.root = TreeNode(value)
# ...
def main():
binary_tree = BinaryTree()
binary_tree.add_node(200)
binary_tree.add_node(300)
binary_tree.add_node(100)
binary_tree.add_node(30)
雖然我建議只擴展TreeNode
定義而不定義BinaryTree
。
您將獲得無限遞歸,因為您沒有使用node
參數,而是將其替換為self.root
。 所以當你遞歸的時候,你每次都從根開始,永遠不會結束。
此外,行node.left = self.add_node(node.left, value)
期望add_node
返回新節點,但您的方法不返回任何內容。 當它更新現有節點時,它應該只返回修改后的節點; 如果它正在創建一個新節點,則返回該節點。
def add_node(self, node, value):
if node is not None:
if not node.value:
node.value = value
elif not node.left:
node.left = value
elif not node.right:
node.right = value
else:
node.left = self.add_node(node.left, value)
return node
else:
return TreeNode(value)
你會像這樣調用這個方法:
binary_tree.root = binary_tree.add_node(binary_tree.root, 30)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.