面試題36:二叉搜尋樹與雙向連結串列
題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的迴圈雙向連結串列。要求不能建立任何新的節點,只能調整樹中節點指標的指向。
理解有點難,具體看註釋
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(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);
}
}
相關文章
- JZ-026-二叉搜尋樹與雙向連結串列
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- Python演算法練習--把搜尋樹轉成雙向連結串列Python演算法
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- 連結串列-雙向連結串列
- 連結串列-雙向通用連結串列
- 雙向連結串列
- 連結串列-雙向非通用連結串列
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 實現雙向連結串列
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 二叉搜尋樹的結構
- 連結串列專題——面試中常見的連結串列問題面試
- LeetCode題解(面試02.08):尋找連結串列與環的交點(Python)LeetCode面試Python
- 資料結構——雙向連結串列資料結構
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- Go實現雙向連結串列Go
- java實現雙向連結串列Java
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 【資料結構】二叉搜尋樹!!!資料結構
- 資料結構-二叉搜尋樹資料結構
- 二叉搜尋樹
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 二叉樹展開為連結串列二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 【LeetCode二叉樹#17】在二叉搜尋樹中插入或刪除某個值(涉及重構二叉樹、連結串列基礎、以及記憶體洩漏問題)LeetCode二叉樹記憶體
- 【c# .net】雙向連結串列( LinkedList )C#
- 雙向連結串列 尾節點插入
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 2024/12/1 【連結串列】 LeetCode 面試題 02.07. 連結串列相交LeetCode面試題