簡體   English   中英

創建二叉表達式樹時為每個節點添加父指針

[英]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.

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