二叉查詢樹轉換成排序的雙向鍊錶

2021-07-02 03:09:11 字數 1166 閱讀 3335

題目:輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何

新的結點,只調整指標的指向。

比如將二元查詢樹

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 ...