[英]Adding parent pointer to each node when creating binary expression tree
所以我有一個完美工作的二叉表達式樹,但是當我試圖修改它以添加一個指向每個節點的父指針時(我稍后需要創建從節點到根的路徑),它不起作用。
class Node:
def __init__(self, value, left=None, right=None, parent=None):
self.value = value
self.left = left
self.right = right
self.parent = parent
class Tree:
def __init__(self, lst):
self.it = iter(lst) # Create an iterator over the list
self.lst = lst
self.root = None
def create_tree(self): # Helper function
value = next(self.it, None)
print(value)
N = Node(value)
if self.root is None:
self.root = N
if value is None: # No more value
return None
if not value.isdigit(): # N = Parent
NL = self.create_tree() # Use recursion to build the left subtree
NR = self.create_tree() # Use recursion to build the right subtree
return Node(value, NL, NR, parent=N) # create a Node instance with them as children
else: # We need a leaf node
return Node(value, parent=N)
lst = ["+", "*", "2", "6", "/", "10", "2"]
t = Tree(lst)
t.create_tree()
現在我認為這些行中的錯誤是: N = Node(value)
return Node(value, NL, NR, parent=N)
return Node(value, parent=N)
Parent=N is the same value as the variable "值”,我稱之為實例。 我可以用什么代替 N 來調用此值的父項?
問題在這里:
return Node(value, NL, NR, parent=N)
和這里:
return Node(value, parent=N)
這個新節點的父節點不是N
。 N
被創建為Node(value)
,這里我們為相同的 value創建另一個節點,但它的父節點引用另一個重復節點。
當您不將parent
參數傳遞給Node
構造函數,而是讓節點構造函數將該屬性設置為None
時,會更容易。
要建立父鏈接,您可以讓構造函數分配給其子元素的parent
屬性。 因此,如果給出了left
參數,則讓該left
獲得對當前初始化實例( self
)的parent
引用。
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
if self.left:
self.left.parent = self
self.right = right
if right:
right.parent = self
self.parent = None
class Tree:
def __init__(self, lst):
it = iter(lst) # Create an iterator over the list
def create_tree(): # Helper function
value = next(it, None)
if value is None: # No more value
return None
if value.isdigit(): # We need a leaf node
return Node(value)
# Use recursion to build the left and right subtree and
# create a Node instance with them as children
return Node(value, create_tree(), create_tree())
self.root = create_tree()
lst = ["+", "*", "2", "6", "/", "10", "2"]
t = Tree(lst)
這樣做不是好的做法:
self.lst = lst
樹不應保留對調用者提供的列表的引用。 這意味着即使這些值已經被處理並存儲為樹中的節點,列表也不能被垃圾回收。
其次, create_tree
是一個輔助函數,不應作為方法提供給您的類的用戶。 調用者已將值列表傳遞給構造函數,並且應該期望構造函數已使用這些值構造了樹。 違反直覺的是,即使調用了構造函數,仍然需要...通過調用create_tree()
來構造樹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.