天梯赛-是否完全二叉搜索树
將一系列給定數(shù)字順序插入一個(gè)初始為空的二叉搜索樹(定義為左子樹鍵值大,右子樹鍵值小),你需要判斷最后的樹是否一棵完全二叉樹,并且給出其層序遍歷的結(jié)果。
輸入格式:
輸入第一行給出一個(gè)不超過(guò)20的正整數(shù)N;第二行給出N個(gè)互不相同的正整數(shù),其間以空格分隔。
輸出格式:
將輸入的N個(gè)正整數(shù)順序插入一個(gè)初始為空的二叉搜索樹。在第一行中輸出結(jié)果樹的層序遍歷結(jié)果,數(shù)字間以1個(gè)空格分隔,行的首尾不得有多余空格。第二行輸出YES,如果該樹是完全二叉樹;否則輸出NO。
輸入樣例1:
9 38 45 42 24 58 30 67 12 51輸出樣例1:
38 45 24 58 42 30 12 67 51 YES輸入樣例2:
8 38 24 12 45 58 67 42 51輸出樣例2:
38 45 24 58 42 12 67 51 NO
題意是輸入一個(gè)n,再輸入n個(gè)數(shù),輸出按這個(gè)序列插入一個(gè)左大右小的BST,試著去判斷這個(gè)bst是不是一顆完全的bst,符不符合完全樹的定義,再輸出層序遍歷序列
如何判斷一棵樹是否是完全二叉樹?我們從條件入手
1 完全二叉樹倒數(shù)第二層以上包括倒數(shù)第二層全滿。
2 最后一層的最后一個(gè)節(jié)點(diǎn)左邊全滿
于是我們不妨先把最大層數(shù)找出來(lái),然后用搜索帶個(gè)層數(shù)的參數(shù),每次搜索判斷如果這一層不是最后一層而少點(diǎn) 那么就不是完全二叉樹? 滿足第一點(diǎn)的判斷
我們按照先右后左的順序搜索,如果走到最后一層的第一個(gè)點(diǎn)一定是最右點(diǎn) 標(biāo)記一下 再走到后面的這一層的節(jié)點(diǎn)時(shí)如果不存在 就不是完全二叉樹 滿足第二點(diǎn)判斷
如果剛才兩點(diǎn)都沒問(wèn)題 就符合完全二叉樹。
code:
#include<bits/stdc++.h> using namespace std; typedef struct bst {int d;bst *l,*r; }NN,*NNN; int flo; NNN insert(NNN p,int t,int lev) {if(p){if(t > p->d)p->l = insert(p->l,t,lev+1);else p->r=insert(p->r,t,lev+1);return p;}else{NNN q = (NNN)malloc(sizeof(NN));// cout<<t<<endl;q->d=t;q->l=q->r=NULL;flo = max(flo,lev);return q; } } bool flag; bool judge1(NNN p,int lev) {if(p){if(lev == flo)flag=1;bool a,b;a = judge1(p->r,lev+1);b = judge1(p->l,lev+1);return a&b;}else if(lev<=flo-1||(lev==flo&&flag))return 0;else return 1; } void levelTre(NNN p) {queue<NNN>q;q.push(p);while(q.size()){NNN a = q.front();q.pop();printf("%d",a->d);if(a->l)q.push(a->l);if(a->r)q.push(a->r);if(q.size())printf(" ");else puts("");} } int main() {int n;cin>>n;NNN p = NULL;for(int i=1;i<=n;i++){int t;scanf("%d",&t);p=insert(p,t,1);} // cout<<flo<<endl;levelTre(p);bool res = judge1(p,1);if(res)puts("YES");else puts("NO");return 0; }創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的天梯赛-是否完全二叉搜索树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VirtualBox虚拟机安装CentO
- 下一篇: C语言:用字符读取流和输出流来读写入数据