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