PAT甲级 1110 - Complete Binary Tree(完全二叉树)

题目链接 https://www.patest.cn/contests/pat-a-practise/1110

【题意】
给定一颗二叉树,判断其是否为一颗完全二叉树

【输入格式】
单组输入,第一行给出一个正整数N(N<=20),它是树中节点的总数,节点的编号从0到N-1。 然后跟着N行,每行对应一个节点,并给出节点的左侧和右侧子节点的编号。 如果子结点不存在,则用“-”代替。

【输出格式】
如果树是完全二叉树,则打印“YES”,并且打印树上最后一个节点的编号,如果不是,则打印“NO”和根结点的标号,中间用空格隔开。

【思路】
数据结构基础题,用一个结构体数组记录一颗二叉树的数据结构,结构体中有par,lson,rson分别代表当前结点的父亲结点,左结点和右结点,均初始化为-1表示不存在。有了这样一个数组后,我们可以从根结点开始进行bfs,当bfs队列的队头元素为-1时跳出循环,根据完全二叉树的性质,如果这时已经访问完所有的树结点,那么这棵树就是一颗完全二叉树,否则一定不是一颗完全二叉树。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 25;

int n, root, last;
struct node {
    int par, lson, rson;
}tree[maxn];

bool bfs() {
    for (int i = 0; i<n; ++i) {
        if (tree[i].par == -1) {
            root = i;
            break;
        }
    }
    int cnt = 0;
    queue<int> que;
    que.push(root);
    while (!que.empty()) {
        int cur = que.front();
        que.pop();
        if (cur == -1) break;
        else {
            ++cnt;
            last = cur;
            que.push(tree[cur].lson);
            que.push(tree[cur].rson);
        }
    }
    return cnt == n;
}

int main() {
    scanf("%d", &n);
    for (int i = 0; i<n; ++i) {
        tree[i].par = tree[i].lson = tree[i].rson = -1;
    }
    for (int i = 0; i<n; ++i) {
        char s1[5], s2[5];
        int le, ri;
        scanf("%s%s", s1, s2);
        if (s1[0] == '-') tree[i].lson = -1;
        else {
            le = atoi(s1);
            tree[i].lson = le;
            tree[le].par = i;
        }
        if (s2[0] == '-') tree[i].rson = -1;
        else {
            ri = atoi(s2);
            tree[i].rson = ri;
            tree[ri].par = i;
        }
    }
    if (bfs()) printf("YES %d\n", last);
    else printf("NO %d\n", root);
    return 0;
}
posted @ 2018-03-20 21:23  不想吃WA的咸鱼  阅读(138)  评论(0编辑  收藏  举报