#include<bits/stdc++.h> using namespace std; const int N = 30; struct tree { int v, l, r; }p[N]; int n; bool st[N]; int k_max; int last; void init() { for (int i = 0;i <= N;i++) { p[i].l = p[i].r = -1; } } void dfs(int root, int k) { //cout << k << endl; if (k > k_max) { k_max = k; last = root; } if (p[root].l != -1) { dfs(p[root].l, 2 * k); } if (p[root].r != -1) { dfs(p[root].r, 2 * k + 1); } } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n; init(); memset(st, false, sizeof(st)); for (int i = 0;i < n;i++) { string s1, s2; cin >> s1 >> s2; p[i].v = i - 1; if (s1 != "-") { int a = stoi(s1); st[a] = true; p[i].l = a; } if (s2 != "-") { int b = stoi(s2); st[b] = true; p[i].r = b; } } int root = 0; while(st[root]){ root++; } dfs(root, 1); if (k_max > n) { cout << "NO " << root; } else { cout << "YES " << last; } }
例题:
给定一个树,请你判断它是否是完全二叉树。
输入格式
第一行包含整数 NN,表示树的结点个数。
树的结点编号为 0∼N−10∼N−1。
接下来 NN 行,每行对应一个结点,并给出该结点的左右子结点的编号,如果某个子结点不存在,则用
-
代替。输出格式
如果是完全二叉树,则输出
YES
以及最后一个结点的编号。如果不是,则输出
NO
以及根结点的编号。数据范围
1≤N≤201≤N≤20
输入样例1:
9 7 8 - - - - - - 0 1 2 3 4 5 - - - -
输出样例1:
YES 8
输入样例2:
8 - - 4 5 0 6 - - 2 3 - 7 - - - -
输出样例2:
NO 1
一棵树判断是否为完全二叉树的板子
最新推荐文章于 2024-11-13 19:36:04 发布