层序遍历
#include<iostream>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 30;
int N, root = 0, ans;
int visit[maxn] = { 0 };
struct node {
int l, r;
}tree[maxn];
queue<int> q;
bool judge(int root) {
q.push(root);
int flag = 0, isCT = 1;
while (!q.empty()) {
int t = q.front();
q.pop();
ans = t;
int l = tree[t].l, r = tree[t].r;
if (l != -1) {
if (flag == 1) { isCT = 0; }
q.push(l);
}
else { flag = 1; }
if (r != -1) {
if (flag == 1) { isCT = 0; }
q.push(r);
}
else { flag = 1; }
//这么些会有两个点过不去,为什么?
/*if (l != -1 || r != -1) {//有子树
if (flag == 0) {
isCT = 0;
break;
}
}
if (l == -1 && r != -1) { isCT = 0; break; }
if (l == -1 || r == -1) { flag = 0; }//存在空枝
if (l != -1) { q.push(l); }
if (r != -1) { q.push(r); }*/
}
return isCT;
}
int f1 = 0, f2 = 0;
int cnt;
int main() {
cin >> N;
char a, b;
int x, y;
/*for (int i = 0; i < N; i++) {
node t = { -1,-1 };
cin >> a >> b;//错误,输入的数不一定是一位数
if(a!='-'){
x = a - '0';
visit[x] = 1;
t.l = x;
}
if(b!='-'){
y = b - '0';
visit[y] = 1;
t.r = y;
}
tree[i] = t;
}*/
for (int i = 0; i < N; i++) {
string l, r;
cin >> l >> r;
if (l == "-") {
tree[i].l = -1;
}
else {
tree[i].l = stoi(l);
visit[stoi(l)] = 1;
}
if (r == "-") {
tree[i].r = -1;
}
else {
tree[i].r = stoi(r);
visit[stoi(r)] = 1;
}
}
while (visit[root] != 0) { root++; }
if (judge(root)) {
cout << "YES " << ans;
}
else { cout << "NO " << root; }
return 0;
}
dfs方法:
#include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
struct node{
int lchild,rchild;
};
struct node a[500];
int ans = -1;
int r;
void dfs(int root,int cnt){
if(cnt > ans){
ans = cnt;
r = root;
}
if(a[root].lchild != -1){
dfs(a[root].lchild,cnt*2);
}
if(a[root].rchild != -1){
dfs(a[root].rchild,cnt*2+1);
}
}
int main(){
int n;
vector<int> book(500,0);
cin >> n;
for(int i = 0;i < n;i++){
string l,r;
cin >> l >> r;
if(l=="-"){
a[i].lchild = -1;
}else{
a[i].lchild = stoi(l);
book[stoi(l)] = 1;
}
if(r=="-"){
a[i].rchild = -1;
}else{
a[i].rchild = stoi(r);
book[stoi(r)] = 1;
}
}
int root=0;
while(book[root] != 0){
root++;
}
dfs(root,1);
if(ans==n){
cout << "YES" << " " << r << endl;
}else{
cout << "NO" << " " << root << endl;
}
}