[英]Leetcode 426. Convert Binary Search Tree to Sorted Doubly Linked List?
[英]Leetcode:convert-binary-search-tree-to-sorted-doubly-linked-list
我的解決方案中有一個“None 沒有 .val”的問題......我想知道如何調試它......
這是描述
將 BST 就地轉換為已排序的循環雙向鏈表。 將左指針和右指針視為雙向鏈表中上一個和下一個指針的同義詞。]
我們以下面的BST為例,或許可以幫助你更好地理解問題:我們想把這個BST轉化為一個循環雙向鏈表。 雙向鏈表中的每個節點都有一個前驅和后繼。 對於循環雙向鏈表,第一個元素的前驅是最后一個元素,最后一個元素的后繼是第一個元素。
下圖顯示了上面 BST 的循環雙向鏈表。 “頭”符號表示它指向的節點是鏈表的最小元素。
https://www.lintcode.com/problem/convert-binary-search-tree-to-sorted-double-linked-list/description
說明:左:反向輸出 右:正序輸出
我的代碼:
class Solution:
"""
@param root: root of a tree
@return: head node of a doubly linked list
"""
def treeToDoublyList(self, root):
# Write your code here.
if not root:
return None
prev = node(0)
self.treeToDoublyList(root.left)
if prev is None:
prev = root
else:
prev.left = root
root.right = prev
self.treeToDoublyList(root.right)
給定節點類:
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
...您可以首先定義一個按順序生成節點的函數:
class Solution:
def inorder(self, tree):
if tree.left:
yield from self.inorder(tree.left)
yield tree
if tree.right:
yield from self.inorder(tree.right)
那么main函數的實現就變成花生米了:
def treeToDoublyList(self, root):
if not root:
return
prev = None
for curr in self.inorder(root):
# Create double link between prev and curr
if prev:
prev.right = curr
else:
head = curr
curr.left = prev
# Prepare for next iteration
prev = curr
# Close the cycle
curr.right = first
head.left = curr
return head
為了測試雙向鏈表,您可以定義另外兩個函數:
def forward(self, head):
node = head
yield node.val
while node.right != head:
node = node.right
yield node.val
def backward(self, head):
node = head
yield node.val
while node.left != head:
node = node.left
yield node.val
調用這些函數如下:
sol = Solution()
# Example tree
tree = Node(4,
Node(2,
Node(1), Node(3)
),
Node(5)
)
res = sol.treeToDoublyList(tree)
print(list(sol.forward(res))) # [1, 2, 3, 4, 5]
print(list(sol.backward(res))) # [1, 5, 4, 3, 2]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.