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

2022-07-25 13:21:26 字數 1504 閱讀 1854

題目:輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換為乙個排序的雙向鍊錶。要求不能建立

任何新的結點,只能調整樹種結點指標的指向。比如輸入下圖的二叉搜尋樹,則輸出轉換

後的雙向排序鍊錶。

1

102 /\36

144 / \ /\54

81216

轉換後的雙向排序鍊錶為:

1468

1012

1416

首先 要明白二叉搜尋樹是根結點大於左子結點,小於右子結點然而要讓轉換後的雙向鍊錶基本有序,則應該中序遍歷該二叉樹

遍歷的時候將樹看成三部分:值為10的根結點,根結點值為6的左

子樹,根結點值為14的右子樹。根據排序鍊錶的定義。值為10的

結點將和左子樹的最大的結點鏈結起來,同時該結點還要和右子樹

最小的結點鏈結起來。

然而對於左子樹和右子樹,遞迴上述步驟即可。

**實現如下:

1 #include 2

using

namespace

std;34

struct

binarytreenode5;

1011

void convertnode(binarytreenode* pnode,binarytreenode**plastnodeinlist)

1231

3233

34 binarytreenode* convert(binarytreenode*prootoftree)

3545

46void createtree(binarytreenode**root)

4755

else

5662}63

64void printtreeinorder(binarytreenode*root)

6570 cout

71 printtreeinorder(root->m_pleft);

72 printtreeinorder(root->m_pright);

7374}75

76void printthelinklist(binarytreenode *head)

7784 cout

85 cout<

86 binarytreenode *last=head;

87 cout<

從後往前變數該雙向鍊錶: ";

88while(last!=null)

8993}94

95int

main()

96

執行截圖:

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

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

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

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

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

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如輸入下圖中左邊兒茶搜尋樹,則輸出轉換後的排序雙向鍊錶。10 614 4 812164 6 8 10 12 14 16 將二叉搜尋樹轉化為有序雙向鍊錶,類似於中序遍歷,中序遍歷的...