リンクリストを使用してバイナリツリーのプリオーダトラバーサルを実行しようとしています。リンクリストを使用してバイナリツリーをトラバースする
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
私は常に取得しています代わりに '7 - - > 1> 2' 'を7 - > 1 - > 2 - > 3 - > 5 - > 4' 行きがけ機能の私の出力として。なぜ私は確信していません。誰かがこの問題を解決するために私の現在のコードを編集する方法を教えてください。
感謝。しかし、コードのどの部分が正しく右側をリンクしていないのかわかりません。追加のif条件を追加するか、現在のif条件の1つを編集する必要がありますか?私は本当に混乱しています。 –
現時点では、あなたに適したデバッグ手法を見つける必要があります。たとえば、紙の上にあなたの木を描く。左端のサブツリーが正しくリンクされるまで、一度に1つのステートメントでコールを処理します。それは7→1→2です。今度は、1つのレベルをバックアップし、右側のサブツリーにペーパートレースします。3.変数値を書き留めて、コードが実際にどのように働いているかを調べ、得られる場所を見つけます。**なし**しかし、 ** 3 **。 – Prune
右の尾があるかどうかをチェックするif条件を変更しました。編集したバージョンを見てください。今私は '7 - > 1 - > 2 - > 4 - > 5'を取得していますが、なぜ3が含まれていないのかわからない –