1. 程式人生 > >判斷是否是完全二叉樹

判斷是否是完全二叉樹

H: CBT?

Time Limit: 1 s      Memory Limit: 128 MB       

Problem Description

對於二叉樹,如果這棵樹的節點排布是按行從上到下,每行從左到右挨個放置,中間不會有空閒的節點。則我們稱之為完全二叉樹。

注:這棵樹的根節點的值一定是1

Input

輸入數字正整數n (1n20

接下來n行,每行為兩個數字(a,b)和一個字元c(L 或者 R),如果字元c是L,則表示b是a的左子節點;如果字元c是R,則表示b是a的右子節點。 (

1≤a,b≤3000">1a,b3000

)

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; }