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

2021-08-17 01:13:47 字數 1441 閱讀 4711

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

我的想法很簡單,分解&遞迴。從下至上構造,將其化為有序鍊錶。構造過程中,若節點有右孩子,則左旋(或右旋),將右(左)孩子作為父節點的新左孩子,最後父節點連線左右子樹(因左子樹所有數大小都小於右子樹任意節點,所以父節點必然在中間),作為新的左(右)孩子。

我以下面的樹做例子講下思路。

首先判斷root是否是null,不為null,則遞迴分解。

遞迴的結果會將其分解為兩個子樹:

仍然不是葉子節點,繼續分解

分解後發現1、3為葉子節點,從下往上進行構造鍊錶。

因為其父節點有左兒子,所以需要進行節點更換,將第一次分解後的樹變為如下結構:

1為新的根節點。

同樣方法處理右子樹。

得到右子樹如下:

整體結構:

將4按照同樣方法來進行處理,令左兒子作為新的根節點,將原根節點接在3的後面,同時連線到5上。

這樣1 -> 2 ->3 ->4 ->5 這樣的鍊錶就構造完成了。

這個**我是按照左移數值增大這麼寫的,但牛客網要求右移增大,所以在**的最後我遍歷翻轉了下指標以達到要求:

class solution 

pleft->left = prootoftree;

if(pright)

pright->right = prootoftree;

prootoftree->left = pright;

prootoftree->right = pleft;

}else

if(pright !=

null)

pret->right =

null;

}counter--;//(2)

if(counter ==

0)//(1),(2),包括此處為翻轉左右子樹指標

}return pret;}};

劍指offer 二叉搜尋樹與雙向連線

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的 思路 與中序遍歷相同 採用遞迴,先鏈結左指標,再鏈結右指標 1,更改doublelinkedlist,最後返回list的第乙...

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

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...

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

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向 輸入一棵二叉搜尋樹 將該二叉搜尋樹轉換成乙個排序的雙向鍊錶 struct treenode class solution 按照中序遍歷,按照左子樹 根節點 右子樹的順序。include ...