面試題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);
}
}
相關文章
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- 微軟面試題,將二叉排序樹轉換成雙向連結串列微軟面試題排序
- Python演算法練習--把搜尋樹轉成雙向連結串列Python演算法
- 連結串列-雙向連結串列
- 雙向連結串列
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- 將二叉排序樹BST轉換成排序的雙向連結串列排序
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- javascript中的連結串列結構—雙向連結串列JavaScript
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 實現雙向連結串列
- 二叉搜尋樹的結構
- 資料結構——雙向連結串列資料結構
- 資料結構:雙向連結串列資料結構
- Go實現雙向連結串列Go
- java實現雙向連結串列Java
- C語言之雙向連結串列C語言
- 二叉搜尋樹
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 資料結構之雙向連結串列資料結構
- 二叉樹展開為連結串列二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- Java雙向連結串列的實現Java
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 雙向連結串列 尾節點插入
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 資料結構之「二叉搜尋樹」資料結構
- 資料結構☞二叉搜尋樹BST資料結構
- 比酒量問題與二叉樹搜尋和路徑問題二叉樹
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題