【題目具體】
將二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新的結點,只能調整樹中結點指標的指向,也就是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.若任意節點的右子樹不空,則右子...
將二叉搜尋樹轉換成排序的雙向鍊錶
二叉搜尋樹的中序遍歷得到的是乙個已排序的序列。因此可以仿照中序遍歷,依次訪問結點並改變結點的指向,使其構成乙個雙向鍊錶。在訪問當前結點之前,需要先訪問左子樹,並改變左子樹中的結點指向,使其構成雙向鍊錶。同時需要獲取左子樹構成雙向鍊錶的頭和尾結點。頭結點是整棵樹構成的雙向鍊錶的頭結點,而尾結點是左子樹...