https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232
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 (≤) 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
代码:
#include <bits/stdc++.h> using namespace std; int N; int vis[110]; int ans = -1, temp; struct Node{ int l; int r; }node[110]; int StringtoInt(string s) { int len = s.length(); int sum = 0; for(int i = 0; i < len; i ++) { sum = sum * 10 + (s[i] - '0'); } return sum; } void dfs(int st, int step) { if(step > ans) { ans = step; temp = st; } if(node[st].l != -1) dfs(node[st].l, step * 2); if(node[st].r != -1) dfs(node[st].r, step * 2 + 1); } int main() { scanf("%d", &N); memset(vis, 0, sizeof(vis)); for(int i = 0; i < N; i ++) { string s1, s2; cin >> s1 >> s2; if(s1 == "-") { node[i].l = -1; } else if(s1 != "-"){ node[i].l = StringtoInt(s1); //cout << node[i].l << endl; vis[node[i].l] = 1; } if(s2 == "-") { node[i].r = -1; } else if(s2 != "-") { node[i].r = StringtoInt(s2); vis[node[i].r] = 1; //cout << node[i].r << endl; } } int root = 0; while(vis[root]) root ++; dfs(root, 1); if(ans == N) printf("YES %d\n", temp); else printf("NO %d\n", root); return 0; }
判断是不是完全二叉树要判断这个树是不是满的 看是不是最大的节点数等于一共的节点数目 dfs 求最大的节点下标
FH