1110. Complete Binary Tree (25)

来源:互联网 发布:上海民族一厂淘宝官网 编辑:程序博客网 时间:2024/05/18 14:22

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;}
原创粉丝点击