我正在嘗試在 python 上制作二叉樹洗掉代碼。出于某種原因,我收到了一個錯誤“AttributeError: 'NoneType' object has no attribute 'right'”。
當我嘗試列印變數“root”的型別時,它顯示<class 'NoneType'>。
此外,當我將 'root = None insert(root, 50)' 更改為 'root = Node(50)' 時,它起作用了。
我猜測類定義或插入函式有一些錯誤。有誰能夠幫助我?
import random
from timeit import default_timer as timer
class Node(object):
def __init__(self, key, parent=None):
self.key = key
self.left = None
self.right = None
self.parent = parent
def insert(node, key):
if node is None:
node = Node(key)
return node
elif key < node.key:
node.left = insert(node.left, key)
node.left.parent = node
else:
node.right = insert(node.right, key)
node.right.parent = node
return node
def delete(node):
if node.parent is None:
node = delete_node(node) # root
elif node == node.parent.left:
node.parent.left = delete_node(node)
else:
node.parent.right = delete_node(node)
def delete_node(r):
if r.left is None and r.right is None:
return None
elif r.left is not None and r.right is None:
return r.left
elif r.left is None and r.right is not None:
return r.right
else:
s = r.right
while s.left is not None:
sparent = s
s = s.left
r.key = s.key
if s == r.right:
r.right = s.right
else:
sparent.left = s.right
return r
root = None
insert(root, 50)
insert(root, 99)
insert(root, 78)
insert(root, 57)
insert(root, 80)
insert(root, 4)
insert(root, 64)
insert(root, 35)
insert(root, 58)
insert(root, 33)
print(root.right.left.key)
start = timer()
delete(root.right.left)
print(timer() - start)
print(root.right.left.key)
uj5u.com熱心網友回復:
insert如果第一個節點不存在,該函式將創建它,但您忽略回傳值。相反,您應該將其重新分配給node:root = insert(root, 50)等。
uj5u.com熱心網友回復:
您需要獲取回傳型別。如果您在函式中重新分配變數,它仍保留在函式范圍內。變數只是變異了,它已經是物件了。這就是您的第二個示例有效的原因:您傳入了 aNode已更改的內容,而您的第一個示例沒有:您創建了 aNode并回傳了它。
您需要root在第一個insert函式中重新分配。
root = assign(None, 50)
assign(root, 99)
…
順便說一句,我經常發現將這些功能分成兩個更容易。您的第一個回傳 new 的Node可能會被呼叫create,并且您只需傳遞一個值。之后,您可以assign使用root節點呼叫。
uj5u.com熱心網友回復:
問題與這樣一個事實有關,即當您在函式內分配變數時,該變數是在本地而不是全域編輯的。insert最簡單的解決方法是從,等回傳值,delete而不是嘗試在函式中分配它:
def some_func(x):
if x is None:
return 1
else:
return x 1
x = None
x = some_func(x)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/457933.html
