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

2021-09-30 12:02:07 字數 1052 閱讀 1381

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

6     14

4  8 12  16

轉換成雙向鍊錶

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

解答:查詢樹進行中序遍歷即可得到從小到大的順序排列,所以採用中序遍歷的方法進行轉換,只是中序遍歷的時候,不是簡單的列印節點資料,而是要對得到的節點的指向進行修改,從而得到雙向鍊錶

// 樹節點(也可以當成雙向鍊錶的節點)

typedef

struct

btreenode

btreenode;

// 建立乙個前面所示的查詢樹

void

createbtree( btreenode**btree )

//全域性變數,用於指向雙向鍊錶的頭結點和尾節點

btreenode*phead=null;

btreenode*ptail=null;

// 調整結點指標指向

void

converttodoublelist(btreenode *pcurrent)

else

//使雙向鍊錶中最後乙個結點的右指標指向當前結點

ptail=pcurrent;//

將當前結點設為雙向鍊錶中最後乙個結點 }

// 中序遍歷查詢樹並調整節點指向得到雙向鍊錶

void

inorder( btreenode *btree )

// 列印雙向聯表

void

printlist( btreenode *phead )

cout

<< endl;

}int

main()

{btreenode *proot= null;

createbtree( &proot);

inorder(proot);

printlist( phead);

system( "pause");

return 0;

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

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

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

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

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

1.首先是如何建立乙個二叉查詢樹 2.再對二叉查詢樹進轉換 如下 bstreenode1.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std struct bstreenode typedef bstreenode doubl...