Given a tree, you are supposed to tell if it is a complete binary tree.
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.
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.
- 9
- 7 8
- - -
- - -
- - -
- 0 1
- 2 3
- 4 5
- - -
- - -
YES 8
- 8
- - -
- 4 5
- 0 6
- - -
- 2 3
- - 7
- - -
- - -
NO 1
判断是否是完全二叉树:首先树的高度和结点个数满足 n >= power(2, h - 1) && n <= (power(2, h) - 1),其次最下面一层的结点必须是从左到右依次排列的,即倒数第二层的结点不能只有右子树而没有左子树,可以只有左子树,而且如果序号在前的结点已经没有左右子树了,序号在后的结点就不能再有左右子树。
- #include
- #include
- #include
- #include
- #include
- using namespace std;
- int n, root, cnt, last, h;
- string l, r;
- bool vis[50];
- bool flag;
-
- struct node {
- int val, left, right;
- } a[50];
- queue
q; -
- int power(int x, int y) {
- int ans = 1;
- while (y > 0) {
- if (y & 1) {
- ans *= x;
- }
- x *= x;
- y >>= 1;
- }
- return ans;
- }
-
- void dfs(int x, int d) {
- h = max(h, d);
- if (a[x].left != -1) {
- dfs(a[x].left, d + 1);
- }
- if (a[x].right != -1) {
- dfs(a[x].right, d + 1);
- }
- }
-
- int main() {
- cin >> n;
- for (int i = 0; i < n; i++) {
- cin >> l >> r;
- a[i].val = i;
- if (l == "-") {
- a[i].left = -1;
- } else {
- a[i].left = atoi(l.c_str());
- vis[atoi(l.c_str())] = 1;
- }
- if (r == "-") {
- a[i].right = -1;
- } else {
- a[i].right = atoi(r.c_str());
- vis[atoi(r.c_str())] = 1;
- }
- if (a[i].left == -1 && a[i].right != -1) {
- flag = 1;
- }
- }
- for (int i = 0; i < n; i++) {
- if (!vis[i]) {
- root = i;
- break;
- }
- }
- if (flag) {
- cout << "NO " << root;
- return 0;
- }
- dfs(root, 1);
- if (!(n >= power(2, h - 1) && n <= (power(2, h) - 1))) {
- cout << "NO " << root;
- return 0;
- }
- q.push(a[root]);
- bool child = 1;
- while (!q.empty()) {
- int u = q.front().val;
- cnt++;
- q.pop();
- if (a[u].left != -1) {
- q.push(a[a[u].left]);
- }
- if (a[u].right != -1) {
- q.push(a[a[u].right]);
- }
- if (a[u].left != -1 && !child) {
- flag = 1;
- }
- if (a[u].right == -1 && child) {
- child = 0;
- }
- if (cnt == n) {
- last = u;
- }
- }
- if (flag) {
- cout << "NO " << root;
- } else {
- cout << "YES " << last;
- }
- return 0;
- }