1、題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
2、**1:(自己實現)
2.1思路:因為二叉搜尋樹的左右子也是乙個二叉搜尋樹,因此對於整個二叉搜尋樹的根節點來說,只要將其左右子樹分別轉換成乙個雙向鍊錶,那麼再將根節點連上就可以了,那麼這就是乙個遞迴問題了。需要注意的乙個點:對於根節點來說,其左邊相連是應該是左子樹對應雙向鍊錶的最右節點;其右邊相連的應該是右子樹對應雙向鍊錶的最左節點。
注意的是:這裡實現本質是二叉樹的先序遍歷,每次乙個子樹,現訪問其根節點,再轉換其左右子樹,最後連起來。
2.2**實現
class solution
if(prootoftree->right)
treenode *pres = prootoftree;
if(temp) //右子樹
while(pres->left)
pres = pres->left;
else
//左子樹
while(pres->right)
pres = pres->right;
return pres;
}//轉換整個二叉搜尋樹
treenode* convert(treenode* prootoftree)
};
3、標準思路
3.1思路:對於每個子樹,將二叉樹轉換成雙向鍊錶後,無論左右子樹都返回雙向鍊錶最右節點的指標,但是二叉樹的遍歷方式是:先轉化其左子樹,將左子樹轉換後的結果和根節點連起來,再轉化其右子樹。因為對於左子樹來說,返回的最右節點的指標剛好就是需要的;對於右子樹來說,轉換後返回的最後的乙個節點的指標就是整個二叉樹的最後乙個節點的指標。
注意:這裡本質上是二叉搜尋樹的中序遍歷,對於每個子樹,先轉化其左子樹,再將其與根節點的連起來,那麼此時根節點成為了已經轉化鍊錶的最右節點,再轉化其右子樹,返回其最後節點的指標即可。
3.2**:
void convertnode(treenode* pnode, treenode** plastnodelist)
class solution
};
3.3程式設計注意事項:
在這裡需要注意的是convertnode函式的第二個引數,是**引數,因為指標本身是一維指標,如果在函式改變一維指標的指向在函式外是有效的,但是如果在函式內改變一維指標的值,那麼在函式外是沒有效果的,那麼要要在函式內改變指標的值,那麼引數必須是指標的指標。以下具體說明:
#include
void changedata1(int* p)
void changedata2(int* p)
void changedata3(int** p)
int main()
因為二叉樹的節點本身就是一維指標,因此要在函式中改變一維指標的本身的值(即指標指向),必須在函式引數中傳入二維指標的引數,在呼叫函式的時候傳入節點指標的引用。 二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...