1110. Complete Binary Tree (25)[完全二叉树]

来源:互联网 发布:人工智能产业园区规划 编辑:程序博客网 时间:2024/06/05 09:26

1. 原题:https://www.patest.cn/contests/pat-a-practise/1110

2. 思路:

题意:完全二叉树题。判断一棵树是否CBT。
思路:
完全二叉树的特点:叶子结点只能在最后出现,不能夹在非叶子结点间。
直接用层序遍历好了。
利用队列进行bfs(广度搜索),当遍历到结点是-1(表示空),则已遍历的结点数
应该为N,则是CBT。
最后一个结点遍历的时候更新即可。
已AC。

3. 源码:

#include <iostream>#include <vector>#include <queue>#include <string>using namespace std;struct Node//存储结点信息{int m_left, m_right;};int main(){//freopen("in.txt", "r", stdin);int N;cin >> N;vector<Node> v(N);//存储二叉树结点vector<int> child(N, 0);//用了判断根for (int i = 0; i < N; i++){string a, b;//注意,不能用char,数字可能大于9.cin >> a >> b;if (a == "-"){v[i].m_left = -1;}else{sscanf(a.c_str(), "%d", &v[i].m_left);//字符串转数字child[v[i].m_left] = 1;}if (b == "-"){v[i].m_right = -1;//表示子结点空}else{sscanf(b.c_str(), "%d", &v[i].m_right);child[v[i].m_right] = 1;}}int root;for (int i = 0; i < N; i++)//找到根结点{if (child[i] == 0){root = i;break;}}queue<int> Q;Q.push(root);int cnt = 0;int lastNode;while (!Q.empty()){int curNode = Q.front();//遍历的当前结点Q.pop();if (curNode != -1){cnt++;lastNode = curNode;//更新最后一个结点Q.push(v[curNode].m_left);Q.push(v[curNode].m_right);}else{if (cnt == N){cout << "YES " << lastNode << endl;break;}else{cout << "NO " << root << endl;break;}}}return 0;}


阅读全文
0 0