題目描述:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。
以下面的二叉搜尋樹為例:
解題思路:
考慮對二叉搜尋樹變成雙向鍊錶,二叉搜尋樹的性質可知,對於每乙個根節點其左子樹的所有節點都小於根節點,右子樹所有節點都大於根節點。而二叉樹的中序遍歷的結果就是從小到大排列。
考慮根節點4,當中序遍歷首先遍歷到葉節點1,葉節點1沒有子節點,所以其左指標指向空,暫時沒有右節點指向它。下一步遞迴到上乙個節點2,並記錄下節點1,節點2的左指標指向1,1的右節點指向2,下一步遞迴到3…
有了這個中序遍歷的思想就可以程式設計實現了。
**如下:
/*
// 每個節點的定義。
class node
node(int _val)
node(int _val, node* _left, node* _right)
};*/
class
solution
void
convert_tree
(node* root,node*
&temp)
};
注:temp最後的時候肯定是指向沒有頭尾相連的鍊錶的尾結點,可以動手退一下,後面再根據這個找到頭結點,將其首尾相連就可以了。 劍指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 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,...