劍指Offer 36 二叉搜尋樹與雙向鍊錶

2022-08-11 07:33:16 字數 828 閱讀 8724

題目描述

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

思路二叉搜尋樹的中序遍歷結果即是排序的序列,因此我們只需要在中序遍歷的過程中處理每乙個被遍歷到的節點的left&right指向,並找到最終要返回的head節點。

cur:當前遍歷到的節點

初始化head = null, pre = head,兩者都為全域性變數。

中序遍歷二叉樹,對每個節點cur:若pre為空,說明是第乙個被遍歷到的節點,也就是值最小的節點,儲存為head;

若pre不為空,將pre和cur連線。

pre = cur

中序遍歷結束時,pre指向最右節點,將其於頭節點head連線。

**:

/*

* * // definition for a node.

* function node(val,left,right) ; */

/*** @param root

* @return */

var treetodoublylist = function

(root)

else

cur.left =pre;

pre =cur;

inorder(cur.right);

}};

時間複雜度:o(n)

空間複雜度:o(1)

易錯:pre一定要設為全域性變數,不能作為引數隨中序遍歷傳遞。如果將pre放在inorder函式中(eg. inorder(cur, pre)),pre = cur 只是將形參pre指向了新的位址,並沒有改變外部pre的值。  

劍指Offer 36 二叉搜尋樹與雙向鍊錶

20.5.4 將 二叉搜尋樹 轉換成乙個 排序的迴圈雙向鍊錶 其中包含三個要素 排序鍊錶 節點應從小到大排序,因此應使用中序遍歷 從小到大 訪問樹的節點 雙向鍊錶 在構建相鄰節點 設前驅節點 pre 當前節點 cur 關係時,不僅應 pre.right cur,也應 cur.left pre 迴圈鍊...

《劍指offer》 36二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 public class treenode public class solution 右子樹轉換後,返回頭結點,連線在根節點右側 treenode rightnode conve...

劍指offer 36 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,...