二叉搜尋樹的中序遍歷得到的是乙個已排序的序列。因此可以仿照中序遍歷,依次訪問結點並改變結點的指向,使其構成乙個雙向鍊錶。在訪問當前結點之前,需要先訪問左子樹,並改變左子樹中的結點指向,使其構成雙向鍊錶。同時需要獲取左子樹構成雙向鍊錶的頭和尾結點。頭結點是整棵樹構成的雙向鍊錶的頭結點,而尾結點是左子樹中最後乙個訪問的結點,用於和根結點連線。然後訪問右子樹,獲取右子樹鍊錶的頭結點和尾結點,頭結點用於連線當前結點和右子樹鍊錶。所以執行的邏輯是:
1.若根節點為空,直接返回
2.根節點不為空,且左子樹存在,先訪問左子樹,並獲取左子樹鍊錶的頭結點和尾結點,左子樹的頭結點即為整棵樹構成鍊錶的頭結點,將左子樹尾結點和根節點連線。
3.若左子樹不存在,根就是鍊錶的頭結點
4.若右子樹存在,訪問右子樹,獲取到右子樹鍊錶的頭結點。將根節點和右子樹的頭結點連線。
5.若右子樹不存在,則根節點即為尾結點。
treenode*
_convert
(treenode* root, treenode*
* last)
else
if(root-
>right)
else
return head;
} treenode*
convert
(treenode* prootoftree)
二叉搜尋樹轉換成排序雙向鍊錶
因為二叉樹中,每個結點都有兩個指向子節點的指標。在雙向鍊錶中也有兩個指標,它們分別指向前乙個和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上可能實現二叉搜尋樹和排序鍊錶的雙向鍊錶的轉換。在搜尋二叉樹中,左子節點的值總小於父節點的值,右子節點的值總是大於父節點...
二叉樹搜尋樹轉換成排序雙向鍊錶
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。先簡單說一說二叉搜尋樹,二叉搜尋樹有乙個特點 根大於左子樹,小於右子樹。二叉搜尋樹的中序遍歷是有序的序列。如下的一棵搜尋二叉樹 轉換成有序雙向鍊錶就要對搜尋二叉樹進行中序遍歷 ...
二叉樹搜尋樹轉換成排序雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。void convert treenode root,treenode prev convert root left,prev root left prev if prev 一開始不需要...