題目:輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何
新的結點,只調整指標的指向。
比如將二元查詢樹
10/ \
6 14
/ \ / \
4 8 12 16
轉換成雙向鍊錶
4=6=8=10=12=14=16。
思路:對於樹的很多題目,都可以使用遞迴的方法來處理。這道題目也不例外。我們從最基本的思路來考慮這個題目。
把乙個二叉樹程式設計雙向鍊錶,最終是乙個有序的序列,也就是中序遍歷之後的結果,那麼當我們採用中序遍歷的方式遍歷二叉樹時,遍歷到某個節點,是的前序節點的右指標指向當前節點,然後當前節點的左指標指向前序節點,然後使得前序節點指向當前節點。
bintree* head =null;
void helper(bintree* root,bintree*& pre)
//cout}bintree* searchtreeconversttolist(bintree* root)
思路二:如果對於當前節點,我們把右子樹轉換成雙向鍊錶,然後把左子樹轉換成雙向鍊錶,轉換的時候我們都標記了鍊錶的頭節點和尾節點,那麼我們只需要將當前節點和左子樹的尾部相連,和右子樹的頭部相連即可。
void helper_second(bintree* root,bintree*& head,bintree*& tail)
bintree* left_head = null;
bintree* left_tail = null;
bintree* right_head = null;
bintree* right_tail = null;
helper_second(root->left,left_head,left_tail);
helper_second(root->right,right_head,right_tail);
if(left_head == null)
head = root;
else
if(right_head == null)
tail = root;
else }
bintree* conversttolist(bintree* root)
二叉搜尋樹轉換成排序雙向鍊錶
因為二叉樹中,每個結點都有兩個指向子節點的指標。在雙向鍊錶中也有兩個指標,它們分別指向前乙個和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上可能實現二叉搜尋樹和排序鍊錶的雙向鍊錶的轉換。在搜尋二叉樹中,左子節點的值總小於父節點的值,右子節點的值總是大於父節點...
將二叉查詢樹轉換成有序雙向鍊錶
一 問題描述 輸入一棵二叉搜尋樹,現在要將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。而且在轉換的過程中,不能建立任何新的結點,只能調整樹中的結點指標的指向來實現。二 實現思路 在二叉搜尋樹中,每個結點都有兩個分別指向其左 右子樹的指標,左子樹結點的值總是小於父結點的值,右子樹結點的值總是大於父結點的值。...
二叉排序樹轉換成雙向鍊錶
在面試過程中經常會出現二叉排序樹轉換成雙向鍊錶的問題 思路 在二叉樹的學習中,我會發現,基本所有的問題都可以用樹的先序遍歷 中序遍歷 後序遍歷解決,所以我們可以使用這個思路來解決。在此問題中,使用的是 後序遍歷。將二叉樹轉換成雙向鍊錶 直接在樹上改動 後序遍歷 public node change ...