將排序二叉樹轉化成雙向鍊錶

2021-06-20 01:05:43 字數 1943 閱讀 4476

將排序二叉樹轉化成雙向鍊錶,應該是一道很常見的面試題目,網上的實現比較多,有用遞迴也有用中序遍曆法的。看到一位外國友人的實現,還是比較清晰的,思路如下:

1,如果左子樹不為null,處理左子樹

1.a)遞迴轉化左子樹為雙向鍊錶;

1.b)找出根結點的前驅節點(是左子樹的最右的節點)

1.c)將上一步找出的節點和根結點連線起來

2,如果右子樹不為null,處理右子樹(和上面的很類似)

1.a)遞迴轉化右子樹為雙向鍊錶;

1.b)找出根結點的後繼節點(是右子樹的最左的節點)

1.c)將上一步找出的節點和根結點連線起來

3,找到最左邊的節點並返回

下面是**實現:

bintree2listutil函式返回的node* 是root節點,bintree2list函式返回的是頭節點

this is the core function to convert tree to list. this function follows

steps 1 and 2 of the above algorithm */

node* bintree2listutil(node* root)

// convert the right subtree and link to root

if(root->right!=null)

returnroot;

}

// the main function that first calls bintree2listutil(), then follows step 3

//  of the above algorithm

node* bintree2list(node *root)

{

// base case

if(root == null)

returnroot;

// convert to dll using bintree2listutil()

root = bintree2listutil(root);

// bintree2listutil() returns root node of the converted

// dll.  we need pointer to the leftmost node which is

// head of the constructed dll, so move to the leftmost node

while(root->left != null)

root = root->left;

return(root);

二叉搜尋樹轉化成雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。其中乙個測試用例 按層序遍歷輸入 對應輸出應該為 from left to right are 4,6,8,10,12,14,16 from right to left are 16,1...

01二叉查詢樹轉化成雙向鍊錶

題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。思路 head指向雙向煉表頭,x指向雙向鍊錶尾,中序遍歷二叉樹,每當遍歷乙個到乙個節點時,將它鏈結到雙向鍊錶尾。include using namespace std define max ...

將二叉搜尋樹轉化成有序的雙向鍊錶

問題描述 輸入乙個二叉搜尋樹,將該二叉樹轉化成乙個排序的雙向鍊錶。要求不能建立任何新的節點,只能夠調整樹中節點指標的指向。二叉樹的節點定義如下 struct node 由於該樹是二叉排序樹,所以每個根節點的左指標指向的是其左子樹的最右下角的節點,右指標指向的應當是其右子樹的最左下的節點。基於以上結論...