您的位置:首页 > 其它

1110. Complete Binary Tree (25)

2017-11-03 14:41 429 查看
n比较小

直接暴力的做

如果层序中某个点没有完完全全的两个儿子,就看看这个点后面的哪些点是不是全都是没儿子的。

有儿子就说明不是cbt。

要注意一个节点如果只有一个儿子的话,只能是左儿子,不能是右儿子。

#include <bits/stdc++.h>
using namespace std;
struct node{
int left;
int right;
int parent;
node()
{
left = right = parent = -1;
}
};
int main(void)
{
int n;
cin >> n;
vector<node> arr(n);
int i;
for (i = 0; i < n; i++)
{
char a[2], b[2];
cin >> a >> b;
if (a[0] != '-')
{
arr[i].left = atoi(a);
arr[atoi(a)].parent = i;
}
if (b[0] != '-')
{
arr[i].right = atoi(b);
arr[atoi(b)].parent = i;
}
}
int root;
i = 0;
while (arr[i].parent != -1) i = arr[i].parent;
root = i;
queue<int> sup;
vector<int> res;
sup.push(root);
while (!sup.empty())
{
int temp = sup.front();
sup.pop();
res.push_back(temp);
if (arr[temp].left != -1) sup.push(arr[temp].left);
if (arr[temp].right != -1) sup.push(arr[temp].right);
}
bool re = true;
int j;
for (i = 0; i < n; i++)
{
if (!(arr[res[i]].left != -1 && arr[res[i]].right != -1))
{
if (arr[res[i]].left == -1 && arr[res[i]].right != -1)
{
re = false;
break;
}
for (j = i + 1; j < n; j++)
{
if (arr[res[j]].left != -1 || arr[res[j]].right != -1)
{
re = false;
break;
}
}
break;
}
}
if (re) cout << "YES " << res[n-1];
else cout << "NO " << root;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: