面試題24 二叉搜尋樹與雙向鍊錶

2021-06-16 22:52:00 字數 2066 閱讀 2724

分析:

1. 二叉樹中,每個結點都有兩個指向子結點的指標。

2. 在雙向鍊錶中,每個結點也有兩個指標,分別指向前乙個結點後乙個結點

。3. 二叉搜尋樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。

4. 將二叉搜尋樹轉換為雙向鍊錶時,原先指向左子結點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子結點的指標調整為鍊錶中指向後乙個結點的指標。

5. 由於要求轉換之後的鍊錶是排好序的,所以我們採取中序遍歷

6.當遍歷轉換到根結點時,左子樹已經轉換成了乙個排序的鍊錶了,並且處在鍊錶中的最後乙個結點是當前值最大的結點,將其與根結點連線起來,接著去遍歷轉換右子樹,並把根結點和右子樹中的最小的結點連線起來。

**:

#include "stdafx.h"

#include using namespace std;

struct binarytreenode

;void convert(binarytreenode *proot, binarytreenode *&plastinlist)

binarytreenode *pcurrentnode = proot;

if (pcurrentnode->m_pleft != null)

pcurrentnode->m_pleft = plastinlist;

if (plastinlist != null)

plastinlist = pcurrentnode;

if (pcurrentnode->m_pright != null) }

binarytreenode *convertbsttodoublelist(binarytreenode *proot)

binarytreenode *plastinlist = null;//指向排好序的雙向鍊錶的最後乙個結點

convert(proot, plastinlist);

while (plastinlist->m_pleft != null)//返回到頭結點

return plastinlist;

}//以先序的方式構建二叉樹,輸入-1表示結點為空

void createbinarytree(binarytreenode *&proot)

else }

void printinorder(binarytreenode *&proot)//中序遍歷二叉樹

}void printdoublelistfromlefttoright(binarytreenode *proot)//從左到右列印雙向鍊錶

binarytreenode *pnode = proot;

while (pnode != null)

cout << endl;

}void printdoublelistfromrighttoleft(binarytreenode *proot)//從右向左列印雙向鍊錶

binarytreenode *pnode = proot;

while (pnode->m_pright != null)

while (pnode != null)

cout << endl;

}int _tmain(int argc, _tchar* argv)

執行結果:

面試題27 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解 見 注釋 struct treenode class solution void convert treenode proot,treenode plastnodeinli...

面試題27二叉搜尋樹與雙向鍊錶

比如輸入圖4.12 中左邊的二叉搜尋樹,則輸出轉換之後的排序現向鍊錶。在二叉樹中,每個結點都有兩個指向子結點的指標。在雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上有可能實現二叉搜尋樹和排序的雙向鍊錶...

面試題36 二叉搜尋樹與雙向鍊錶

面試題36 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。調整指標 原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標 原先指向右子節點的指標調整為鍊錶中指向後乙個節點的指標 如何調整 考慮根節點和左右子樹的根本情況,因為如果用...