將一系列給定數字順序插入乙個初始為空的二叉搜尋樹(定義為左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。
輸入第一行給出乙個不超過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個正整數順序插入...