將二叉搜尋樹轉換成乙個排序的雙向鍊錶

2021-08-04 14:59:50 字數 1802 閱讀 8736

【題目具體】

將二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新的結點,只能調整樹中結點指標的指向,也就是left當prev,right當next。

以如下的二叉樹為例:

要將此二叉樹轉化稱為如下的雙向鍊錶:

將pleft指標當作指向前乙個結點的指標,將pright指標當作指向後乙個結點的指標。

則步驟可以分以下:

1.先找到最左邊的結點0作為頭結點phead。

2.遞迴處理左子樹,將它的上乙個結點0用prev記錄住,找到最左邊的結點後。

3.處理當前結點0,將0的pleft指標指向prev,若prev為空,則不用對它進行操作,將prev指向當前結點,當前結點沒有右子樹,返回到上一層遞迴。

4.處理當前結點1,將結點1的pleft指標指向prev也就是結點0,此時prev結點不為空,則將prev的pright指標指向當前結點1,將prev指向當前結點。

5.當前結點1有右孩子,再對右子樹進行左子樹同等操作,1的右孩子2,2的pleft指向prev也就是結點1,此時prev不為空,則將prev的pright指向當前結點2,再更新prev指向當前結點2,然後返回到上一層。

此時結果如下:

6.按照以上的方法一直進行遞迴實現。

【**實現】

/將鍊錶轉化為乙個雙向鍊錶

node* todb_list()

void printlist(node* phead)

//private:

///將鍊錶轉為乙個雙向鍊錶

node* _todb_list(node* proot)

node * phead = pcur;

node* last_node = null; //指向上乙個結點

_convertnode(proot,last_node); //呼叫遞迴函式

return phead;

} void _convertnode(node* proot,node * &last_node) ///遞迴實現函式

void _printlist(node* phead) ///列印雙向鍊錶的函式

cout<

測試**

binarysearchtrees1;

s1.insert(5,0);

s1.insert(3,0);

s1.insert(1,0);

s1.insert(7,0);

s1.insert(8,0);

s1.insert(2,0);

s1.insert(6,0);

s1.insert(0,0);

s1.insert(9,0);

bstnode* phead = s1.todb_list();

s1.printlist(phead);

執行結果:

將二叉搜尋樹轉換成乙個排序雙向鍊錶

將二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。定義 二叉搜尋樹也叫二叉查詢樹或二叉排序樹,它可以是一顆空樹,或者是滿足如下性質的二叉樹 若該樹的左子樹不為空,則左子樹上所有節點的值均小於根節點的值,若該樹的右子樹不為空,則右子樹上所有節點的值均大於根節點...

將二叉搜尋樹轉換成乙個排序的雙向鍊錶

二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 1.若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2.若任意節點的右子樹不空,則右子...

將二叉搜尋樹轉換成排序的雙向鍊錶

二叉搜尋樹的中序遍歷得到的是乙個已排序的序列。因此可以仿照中序遍歷,依次訪問結點並改變結點的指向,使其構成乙個雙向鍊錶。在訪問當前結點之前,需要先訪問左子樹,並改變左子樹中的結點指向,使其構成雙向鍊錶。同時需要獲取左子樹構成雙向鍊錶的頭和尾結點。頭結點是整棵樹構成的雙向鍊錶的頭結點,而尾結點是左子樹...