這道題目來自
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...