判断是否是完全二叉树

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的右子节点。 (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;

}

 

posted @ 2018-12-04 21:42  知道了呀~  阅读(540)  评论(0编辑  收藏  举报