判斷是否是完全二叉樹
H: CBT?
Time Limit: 1 s Memory Limit: 128 MBProblem Description
對於二叉樹,如果這棵樹的節點排布是按行從上到下,每行從左到右挨個放置,中間不會有空閒的節點。則我們稱之為完全二叉樹。
注:這棵樹的根節點的值一定是1
Input
輸入數字正整數n (1≤n≤20
)
接下來n行,每行為兩個數字(a,b)和一個字元c(L 或者 R),如果字元c是L,則表示b是a的左子節點;如果字元c是R,則表示b是a的右子節點。 (
)
Output
判斷這棵樹是否為完全二叉樹,如果是則輸出Yes,否則輸出No
Sample Input
5
1 2 L
1 3 R
2 4 L
2 5 R
3 6 L
Sample Output
Yes
Hint
樣例解釋:樣例所描述的二叉樹結構如下
很顯然這是一個完全二叉樹。
是完全二叉樹的幾種情況:
(1)、只有根節點
(2)、每一個節點都有左右節點或者是有左節點但沒有右節點
#include<iostream> #include<string.h> #include<queue> #include<stdio.h> using namespace std; struct p { int num; int l; int r; }p[2000]; int main() { int n,a,b; char s; cin>>n; for(int i=1;i<=n+1;i++)//有n條描述,但是有n+1個節點 { p[i].l=0; p[i].r=0; } for(int i=0;i<n;i++) { cin>>a>>b>>s;if(s=='L') p[a].l=b; else p[a].r=b; p[a].num=a; } int cnt=0; for(int i=1;i<=n+1;i++) { if(p[i].l!=0&&p[i].r!=0) { cnt++; continue; } if(p[i].l!=0&&p[i].r==0) { cnt++; continue; } if(p[i].l==0&&p[i].r==0) { cnt++; continue; } } if(cnt==n+1) cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }