是否完全二叉搜尋樹(30 分)

2021-10-25 03:56:42 字數 1832 閱讀 3893

將一系列給定數字順序插入乙個初始為空的二叉搜尋樹(定義為左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。

輸入格式:

輸入第一行給出乙個不超過20的正整數n;第二行給出n個互不相同的正整數,其間以空格分隔。

輸出格式:

將輸入的n個正整數順序插入乙個初始為空的二叉搜尋樹。在第一行中輸出結果樹的層序遍歷結果,數字間以1個空格分隔,行的首尾不得有多餘空格。第二行輸出yes,如果該樹是完全二叉樹;否則輸出no。

輸入樣例1:

9

3845

4224

5830

6712

51

輸出樣例1:

38

4524

5842

3012

6751

yes

輸入樣例2:

8

3824

1245

5867

4251

輸出樣例2:

38

4524

5842

1267

51no

拋磚引玉:

本題的核心步驟大概分為三步:

*如何構建乙個二叉搜尋樹

*如何通過層序遍歷輸出一棵二叉搜尋樹

*如何檢查二叉搜尋樹是否為一棵完全二叉樹

對於第一步與第二步為二叉樹的基本操作,對著下面的**自己敲一遍應該就能略知一二。

對於第三步延續了層序遍歷的思想,要設法知道什麼時候遍歷到最後一層,我的想法是引入乙個count計數板,每次出隊count+1,當入隊的元素為null時,立刻結束入隊,然後把佇列排空,當排空佇列時一直保持計數。因為最後一次進隊的元素為null所以count在最後需要-1.最後將count和n進行比較即可。

可能有錯,僅供參考:

#include

#include

using

namespace std;

struct node

;node *

insert

(int a,node *root)

else

if(a>root-

>data)

}return root;

}int flag=0;

void

cengxubianli

(node *root)

else

b[in++

]=b[out]

->left;

b[in++

]=b[out]

->right;

} out++;}

}void

judge

(node *root,

int n)

else

if(front-

>right!=

null

)else

a.pop();

count++;}

while

(!a.

empty()

) count--;if

(countelse

if(count==n)

}int

main()

for(

inti(0

);i)cengxubianli

(root)

;judge

(root, n)

;}

work hard, stay humble.

是否完全二叉搜尋樹 30分

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。輸入格式 輸入第一行給出乙個不超過...

5 13 是否完全二叉搜尋樹 30分

5 13 是否完全二叉搜尋樹 30分 將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。輸入第一行給出乙個不超過20的正整數n 第二行給出n個互不相同的正整數,其間以空格分隔。將輸入的n個正整數順序插入...

7 2 是否完全二叉搜尋樹 (30 分)

將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。輸入第一行給出乙個不超過20的正整數n 第二行給出n個互不相同的正整數,其間以空格分隔。將輸入的n個正整數順序插入乙個初始為空的二叉搜尋樹。在第一行中輸...