二元查詢樹與排序的雙向鍊錶的轉換

2021-07-11 10:03:54 字數 1001 閱讀 6327

這道題目來自

1.把二元查詢樹轉變成排序的雙向鍊錶

題目:

輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。

要求不能建立任何新的結點,只調整指標的指向。

10 / \

6 14

/ \ / \

4 8 12 16

轉換成雙向鍊錶

4=6=8=10=12=14=16。

首先我們定義的二元查詢樹節點的資料結構如下:

struct bstreenode

;首先先記錄下自己的錯誤的思路,自己是希望不改變樹的結構,再樹的結構的基礎上稍加改建指標,形成雙鏈表,但是在不斷的是調程式中,發現很容易陷入無限迴圈中,錯誤的思路:第一先找到葉子結點,葉子結點的左孩子指向父節點,第二,找每個非葉子結點的左子樹最右節點與右子樹的最左節點,該節點的左子樹最右節點指向該節點,該節點右子樹的最左節點也指向該節點。感覺思路是正確的但那時總是容易陷入死迴圈中,所以在網上查詢了答案,

正確答案的思路是:利用中序遍歷的時候進行改變指標,這時樹的基本結構實際上被改變了,已經改變成了線性結構,一下的**片段是按照中序遍歷改變指標的,可能與作者的答案有些不同,但是執行結果是正確的,本**片中數的構建是按照先序遍歷進行的。

#include

using namespace std;

struct bstreenode;

typedef bstreenode doublelist;

doublelist * phead,* ptail;

void creattree(bstreenode*

&t) else

return;

}void my_convertlist(bstreenode* pcurrent)

else

}void inordertrans(bstreenode*t)

int main()

二元查詢樹變雙向鍊錶

宣告 取自 july 的 微軟100題 加上一些個人理解,歡迎拍磚。學習微軟100題筆記 1.二元查詢樹變雙向鍊錶 include include struct bstreenode typedef bstreenode doublelist doublelist phead doublelist ...

二元查詢樹轉變成排序的雙向鍊錶

描述 輸入一顆二元查詢樹,將二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立人新建立的結點,只調整指標的指向。我的思路 利用遞迴思想進行解答。1.分解,將結點p分解成左子樹和右自樹兩個部分。2.解決子問題,左子樹變成乙個雙向鍊錶,右子樹變成乙個雙向鍊錶。3.合併,將結點p的left 連線到左子樹中最...

二元查詢樹轉變成排序的雙向鍊錶

把二元查詢樹轉變成排序的雙向鍊錶 題目 輸入一棵二元查詢樹,將該轉換成個排 序的雙向鍊錶。要求不能建立任何新的結點,只調整指標向。10 6 14 4 8 12 8 轉換成雙向鍊錶 4 6 8 10 12 14 16 利用中序遍歷來解決比較簡單,這裡我主要提供一種非遞迴版本來解決這個問題 遞迴版本 c...