面試題36:二叉搜尋樹與雙向連結串列

鹹魚不會游泳發表於2020-12-04

題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的迴圈雙向連結串列。要求不能建立任何新的節點,只能調整樹中節點指標的指向。

理解有點難,具體看註釋

參考網友解法

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-TJPxcJ0T-1607042577604)(en-resource://database/610:1)]

  • 時間複雜度 O(n)
  • 空間複雜度 O(n) ,當樹退化為連結串列的時候,遞迴深度為 n
class Solution {
    Node head, pre;
    public Node treeToDoublyList(Node root) {
        if (root == null) {
            return null;
        }
        dfs(root);                 // dfs() 方法沒有處理頭尾結點
        pre.right = head;      // dfs() 結束之後,head 指向頭結點, pre 指向尾結點,單獨進行處理
        head.left = pre;
        return head;
    }
    public void dfs(Node cur) {
        if (cur == null) {      // 當前結點為空,直接返回
            return ;
        }
        dfs(cur.left);           // 中序遍歷,先對做結點進行處理
        if (pre == null) {     // pre 為空,說明之前沒有處理過結點,即當前結點是頭結點
            head = cur;
        } else {
            pre.right = cur;  // 由於是中序遍歷,pre 指向的是當前結點的左結點
        }
        // 接下來這句和 else 裡面的那句共同構造雙向指標,這句話不用放到 else 裡面
        // 因為 pre 可能為空,即當前結點是頭結點,在 dfs 裡面,對頭尾暫時不進行處理
        cur.left = pre;       
        pre = cur;
        dfs(cur.right);
    }
}

相關文章