7 1 是否完全二叉搜尋樹 30分

2021-10-09 04:50:00 字數 3115 閱讀 5331

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

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

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

9

38 45 42 24 58 30 67 12 51

38 45 24 58 42 30 12 67 51

yes

8

38 24 12 45 58 67 42 51

38 45 24 58 42 12 67 51

no

這個題就是欺負人。你知道什麼是二叉搜尋樹就能做,不知道就不能做。

二叉搜尋樹

二叉排序樹(binary sort tree),又稱二叉查詢樹(binary search tree),亦稱二叉搜尋樹。是資料結構中的一類。在一般情況下,查詢效率比鍊錶結構要高。

一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的結點。

就是在二叉樹基礎上的縱深的概念。

看了一遍,順便按照案例再手寫了幾遍就能找到思路了。

沒錯,就是dfs建樹。

cin>>root;            //讀入的第乙個就是根節點

for(int i=1;i<=n-1;i++)

void dfs(int i,int root) //模擬手寫判斷

else if(i

建好後乙個難點就是判斷是不是完全二叉樹。

判斷一棵樹是否是完全二叉樹的思路

1>如果樹為空,則直接返回錯

2>如果樹不為空:層序遍歷二叉樹

2.1>如果乙個結點左右孩子都不為空,則pop該節點,將其左右孩子入佇列;

2.1>如果遇到乙個結點,左孩子為空,右孩子不為空,則該樹一定不是完全二叉樹;

2.2>如果遇到乙個結點,左孩子不為空,右孩子為空;或者左右孩子都為空;則該節點之後的佇列中的結點都為葉子節點;該樹才是完全二叉樹,否則就不是完全二叉樹;

於是就在佇列輸出層序遍歷中新增了些東西。

ac**

#includeusing namespace std;

struct nodep[200000];

void dfs(int i,int root) //搭建樹

else if(iq;

vectorvec;

int main()

//層序遍歷

int flag=1,ye=0;

q.push(root);

while(q.size())

else if(p[head].l==0&&p[head].r!=0)

else if(p[head].l!=0 && p[head].r==0)

//ye非0就是開啟了(第3/4種都可以開啟)

else

q.pop();

} for(int i=0;i但是啊,兄弟們,有木有覺得這個完全二叉樹判斷寫起來很費勁呢?

我是真的感覺費勁,要想好多,還要除錯,我才過得。

我在網上找到了更好的辦法。

雖然它用的是指標,但可以吸收思想。

新的判斷思路:

佇列一步步向下走時,將當前節點的左右子樹都加入佇列(哪怕它沒有,也就是為0),直到隊首節點為0,遍歷結束。

此時,若所有題中節點已被遍歷(佇列經過n個點),則是完全二叉樹。

若還有題中節點未被遍歷,則不是完全二叉樹。

手寫畫畫自可發現其正確性。

所以,我只需要進行記數,最後與n進行比對就好啦。

我想把記數寫入層序遍歷,使**得到體量上的最大優化。卻產生了有問題的**。

問題**

#includeusing namespace std;

struct nodep[200000];

void dfs(int i,int root) //搭建樹

else if(iq;

vectorvec;

int main()

//層序遍歷

int cou=0;

q.push(root);

while(q.size())

for(int i=0;i經過檢查,這個break,能夠保證跳出迴圈,使cou不再增加,最終參與判斷。

但若題中為非完全二叉樹,這個break就會導致有一些資料還沒有經層序遍歷就結束了,最終的層序遍歷就會少幾個數。

為了避免這一點,我只能寫兩次遍歷,乙個遍歷,乙個判斷。我把判斷封裝成了函式。

新的ac**

#includeusing namespace std;

int cou=0; //判斷

struct nodep[200000];

queueq;

vectorvec;

void dfs(int i,int root)

else if(i>n;

cin>>root;

for(int i=1;i<=n-1;i++)

//層序遍歷

q.push(root);

while(q.size())

for(int i=0;icout

//判斷完全二叉樹

if(cou==n) cout<<"yes\n";

else cout<<"no\n";

return 0;

}

是否完全二叉搜尋樹 30分

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

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

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

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

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