1110. Complete Binary Tree (25)

Given a tree, you are supposed to tell if it is a complete binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=20) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N-1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a “-” will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each case, print in one line “YES” and the index of the last node if the tree is a complete binary tree, or “NO” and the index of the root if not. There must be exactly one space separating the word and the number.

Sample Input 1:
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -
Sample Output 1:
YES 8
Sample Input 2:
8
- -
4 5
0 6
- -
2 3
- 7
- -
- -
Sample Output 2:
NO 1

Java AC代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
    static final int maxn = 1000+5;
    static class Node {
        int data;
        int lchild = -1;
        int rchild = -1;
    }
    static boolean[] IsRoot = new boolean[maxn];
    static void init() {
        for (int i = 0; i < maxn; i++) {
            IsRoot[i] = true;
        }
    }
    public static void main(String[] args) {
        try {
            init();
            ArrayList<Node> nodelist = new ArrayList<>();
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(reader.readLine());
            for (int i = 0; i < n; i++) {
                String cas = reader.readLine();
                String a = cas.split(" ")[0];
                String b = cas.split(" ")[1];
                Node nodeab = new Node();
                if (!a.equals("-")) {
                    nodeab.lchild = Integer.parseInt(a);
                    IsRoot[nodeab.lchild] = false;
                }
                if (!b.equals("-")) {
                    nodeab.rchild = Integer.parseInt(b);
                    IsRoot[nodeab.rchild] = false;
                }
                nodelist.add(nodeab);
            }
            int root = 0;
            for (int i = 0; i < n; i++) {
                if (IsRoot[i] == true) root = i;
            }
            ArrayList<Node> list = new ArrayList<>();
            list.add(nodelist.get(root));
            int last = 0;
            int cnt = 1;
            while (list.size() != 0) {
                Node front = list.get(0);
                list.remove(front);
                if (front.lchild != -1) {
                    list.add(nodelist.get(front.lchild));
                    last = front.lchild;
                    cnt++;
                }
                else break;
                if (front.rchild != -1) {
                    list.add(nodelist.get(front.rchild));
                    last = front.rchild;
                    cnt++;
                }
                else break;
            }
            if (cnt == n) System.out.println("YES " + last);
            else System.out.println("NO " + root);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

C++:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
struct node {
    int data, lchild, rchild;
    node():lchild(-1), rchild(-1){}
}nodes[maxn];
bool isNode[maxn] = { true };
void init() {
    for (int i = 0; i < maxn; i++) {
        isNode[i] = true;
    }
}
int main()
{
    init();
    int n;
    scanf("%d", &n);
    char left[3], right[3];
    for (int i = 0; i < n; i++) {
        scanf("%s %s", left, right);
        if (left[0] != '-') {
            nodes[i].lchild = atoi(left);
            isNode[atoi(left)] = false;
        }
        if (right[0] != '-') {
            nodes[i].rchild = atoi(right);
            isNode[atoi(right)] = false;
        }
    }
    int root;
    for (int i = 0; i < n; i++) {
        if (isNode[i] == true) root = i;
    }

    queue<node> q;
    q.push(nodes[root]);
    int last = 0;
    int cnt = 1;
    while (!q.empty()) {
        node kfront = q.front();
        q.pop();
        if (kfront.lchild != -1) {
            q.push(nodes[kfront.lchild]);
            cnt++;
            last = kfront.lchild;
        }
        else break;
        if (kfront.rchild != -1) {
            q.push(nodes[kfront.rchild]);
            cnt++;
            last = kfront.rchild;
        }
        else break;
    }
    if (cnt == n) printf("YES %d\n", last);
    else printf("NO %d\n", root);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值