1110. Complete Binary Tree (25)

来源:互联网 发布:网络是什么时候发明的 编辑:程序博客网 时间:2024/05/18 14:43

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;}
原创粉丝点击