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.
代码:
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; struct node{ int l, r; }a[100]; int maxn = -1, ans; void dfs(int root, int index) {//判断树是否为完全二叉树 if(index > maxn) {//如果为完全二叉树,maxn才能与n相等 maxn = index; ans = root; } if(a[root].l != -1) dfs(a[root].l, index * 2); if(a[root].r != -1) dfs(a[root].r, index * 2 + 1); } int main() { int n, root = 0, have[100] = {0}; cin >> n; for (int i = 0; i < n; i++) {//构建树,查找根节点 string l, r; cin >> l >> r; if (l == "-") { a[i].l = -1; } else { a[i].l = stoi(l); have[stoi(l)] = 1; } if (r == "-") { a[i].r = -1; } else { a[i].r = stoi(r); have[stoi(r)] = 1; } } while (have[root] != 0) root++;//得到根节点 dfs(root, 1);//深搜查找是否符合完全二叉树 if (maxn == n) cout << "YES " << ans; else cout << "NO " << root; return 0; }