因為二叉樹中,每個結點都有兩個指向子節點的指標。在雙向鍊錶中也有兩個指標,它們分別指向前乙個和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上可能實現二叉搜尋樹和排序鍊錶的雙向鍊錶的轉換。
在搜尋二叉樹中,左子節點的值總小於父節點的值,右子節點的值總是大於父節點的值(所以使用中序遍歷)。因此在轉換成排序鍊錶的時候,原先指向左子節點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子節點的指標調整為鍊錶中指向後乙個結點指標
轉變時候的基本步驟
1、先找到樹的最左邊的葉子結點(即它的左右孩子都為空),那麼就讓它的左指標指向鍊錶結點(第一次的時候,鍊錶結點肯定都為空,但是到後面的時候,鍊錶結點就是現在找到的這個左邊葉子結點的前驅)
2、如果這個鍊錶結點不為空,那麼就讓這個鍊錶結點的後繼指標指向剛剛的這個最左邊的葉子結點,然後讓鍊錶結點plastnodeinlist指向這個葉子結點,因為plastnodeinlist指向的是排序後的鍊錶的最後乙個結點
3、轉換完成之後,plastnodeinlist是指向排序鍊錶的最後乙個結點,但是我們需要返回的是頭結點,所以利用雙向鍊錶的性質再給它一直逆走到頭結點即可
//二叉搜尋樹轉換成排序的雙向鍊錶
void covernode(treenode *pnode, treenode **plastnodeinlist)
treenode *pcurrent = pnode;
if(pcurrent->lchild != null)
pcurrent->lchild = *plastnodeinlist; //讓該節點的左指標指向前乙個結點
if(*plastnodeinlist != null)
*plastnodeinlist = pcurrent;
if(pcurrent->rchild != null) }
treenode* covert(treenode *prootoftree)
return pheadoflist;
}
二叉樹搜尋樹轉換成排序雙向鍊錶
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。先簡單說一說二叉搜尋樹,二叉搜尋樹有乙個特點 根大於左子樹,小於右子樹。二叉搜尋樹的中序遍歷是有序的序列。如下的一棵搜尋二叉樹 轉換成有序雙向鍊錶就要對搜尋二叉樹進行中序遍歷 ...
二叉樹搜尋樹轉換成排序雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。void convert treenode root,treenode prev convert root left,prev root left prev if prev 一開始不需要...
二叉搜尋樹轉換成雙向鍊錶
問 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。public class treenode public class solution 如果已經遍歷到葉子節點,則將最後的節點轉變成葉子節點 if prootoftree.left ...