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

2021-07-02 12:26:17 字數 1281 閱讀 4162

題目:

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新節點,只能調整樹中結點指標的指向。最後輸出排序後雙向鍊錶。

基本思想:

二叉樹中每個節點都有兩個指向子節點的指標。在雙向鍊錶中,每個節點也有兩個指標,分別指向前乙個節點和後乙個節點。

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

在轉換成雙向鍊錶時,原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標,原先指向右子節點的指標調整為鍊錶中指向後乙個節點的指標。

中序遍歷樹中的每乙個節點,中序遍歷演算法是按照從小到大的順序遍歷二叉樹的。

當遍歷到根節點時,樹看成三部分:值為10的節點、根節點值為6的左子樹,根節點值為14的右子樹,

值為10的節點將和它的左子樹的最大乙個節點(8)連線起來,同時它還將和右子樹最小的節點(12)連線起來。

按照中序遍歷的特點,當遍歷轉換到根節點(10)時,它的左子樹已經轉換成乙個排序的鍊錶了,並且處在鍊錶中的最後乙個節點是8,把8和10連線起來,最後乙個節點成為了10,接著我們遍歷轉換右子樹,將10和12連線起來。

至於如何轉換左右子樹,用遞迴。

#include using namespace std;  

//二叉樹結點定義

typedef struct bitreenodebitreenode,*bitree;

//按先序序列建立二叉樹

int createbitree(bitree &t)

else

return 0;

} void convertnode(bitree pnode, bitree * plastnodeinlist)

bitree convert(bitree prootoftree)

//訪問函式

void visit(bitree t)

//先序遍歷

void preorder(bitree t)

} //輸出雙向鍊錶

void printlist(bitree proot)

cout<

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

題面 劍指offer p151 牛客網 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。如 如果不考慮箭頭,可以看到4 6 8 10 12 14 16是樹的中序遍歷 因此可以借用中序遍歷的方法進行修改 struct treenode ...

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

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 二叉搜尋樹左小右大,中序遍歷。當前結點左結點連線左子樹最大值,左子樹最大值右結點連線當前節點,以當前結點為最大值,以右子樹和最大值遞迴。include using names...

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

題目描述 輸入一課二叉搜尋樹,將該二叉樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如,輸入圖中的二叉搜尋樹,則輸出轉換之後的雙向鍊錶 從中我們可以發現雙向鍊錶中的結點順序和二叉搜尋樹的中序遍歷得到的序列順序是一樣的。我們可以使用遞迴和非遞迴兩種方式實現這道題的...