Ich versuche, eine Preorder-Traversal von binären Baum mit einer verknüpften Liste zu tun.Durchlaufen einer binären Struktur mit verknüpften Liste
class BTNode:
"""A node in a binary tree."""
def __init__(self: 'BTNode', item: object,
left: 'BTNode' =None, right: 'BTNode' =None) -> None:
self.item, self.left, self.right = item, left, right
class LLNode:
"""A node in a linked list."""
def __init__(self: 'LLNode', item: object, link: 'LLNode' =None) -> None:
self.item, self.link = item, link
def __str__(self: 'LLNode') -> str:
"""Return an informative string showing self
>>> b = LLNode(1, LLNode(2, LLNode(3)))
>>> str(b)
'1 -> 2 -> 3'
"""
return str(self.item) + (' -> ' + str(self.link) if self.link else '')
def preorder(root: BTNode) -> LLNode:
"""Return the first node in a linked list that contains every value from the
binary tree rooted at root, listed according to an preorder traversal.
>>> b = BTNode(1, BTNode(2), BTNode(3))
>>> repr(preorder(b))
'LLNode(1, LLNode(2, LLNode(3)))'
>>> b2 = BTNode(4, BTNode(5))
>>> b3 = BTNode(7, b, b2)
>>> str(preorder(b3))
'7 -> 1 -> 2 -> 3 -> 4 -> 5'
"""
return _preorder(root)[0]
def _preorder(root: BTNode) -> (LLNode, LLNode):
"""Return the first and last nodes in a linked list that contains every
value from the binary tree rooted at root, listed according to an preorder
traversal.
"""
if not root:
return None, None
left_head, left_tail = _preorder(root.left)
right_head, right_tail = _preorder(root.right)
# change from right_tail = left_tail to right_tail = left_head
if not right_tail:
right_tail = left_head
if not left_head:
left_head = right_head
if left_tail:
left_tail.link = right_head
root_node = LLNode(root.item, left_head)
return root_node, right_tail
ich immer immer '7 -> 1 -> 2' anstelle von '7 -> 1 -> 2 -> 3 -> 4 -> 5' als meine Ausgabe in Preorder-Funktion. Ich bin mir nicht ganz sicher warum. Könnte mir bitte jemand sagen, wie ich meinen aktuellen Code bearbeiten kann, um dieses Problem zu beheben?
Vielen Dank für das Debugging. Ich bin mir jedoch nicht sicher, welcher Teil des Codes die rechte Seite nicht richtig verbindet. Muss ich eine zusätzliche Bedingung hinzufügen oder eine meiner aktuellen if-Bedingungen bearbeiten? Ich bin ziemlich verwirrt. –
Im Moment müssen Sie eine Debugging-Technik finden, die für Sie funktioniert. Zeichnen Sie zum Beispiel Ihren Baum auf Papier. Arbeite durch die Aufrufe, jeweils eine Anweisung, bis du den linken Teilbaum richtig verbunden hast; das ist 7-> 1-> 2. Sichern Sie nun eine Ebene und führen Sie eine Papierverfolgung durch den rechten Teilbaum durch. 3. Notieren Sie Variablenwerte und untersuchen Sie, wie der Code * tatsächlich * funktioniert. Suchen Sie nach der Stelle, an der Sie ** None ** erhalten, die Sie jedoch erwarten **3**. – Prune
Ich habe meine if-Bedingung geändert, die prüft, ob es einen rechten Schwanz gibt. Bitte schauen Sie sich die bearbeitete Version an. Jetzt bekomme ich '7 -> 1 -> 2 -> 4 -> 5', aber ich bin nicht sicher, warum die 3 nicht enthalten ist –