簡體   English   中英

Leetcode: 轉換二進制搜索樹到排序雙向鏈表

[英]Leetcode:convert-binary-search-tree-to-sorted-doubly-linked-list

我的解決方案中有一個“None 沒有 .val”的問題......我想知道如何調試它......

這是描述

  1. 將二叉搜索樹轉換為已排序的雙向鏈表

將 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.

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