题解 | #判断是不是完全二叉树#
判断是不是完全二叉树
https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include <list>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isBranchEmpty(TreeNode*
root) { //判断根节点左右指针是否为空。都为空,返回true;否则返回false.
if (root->left == nullptr && root->right == nullptr) {
return true;
}
return false;
}
//使用广度优先搜索算法,用一个队列list记录首次出现空节点的那一层所有节点。只有list中节点满足#1.“非空,非空,...,非空,空,空,空”;2.list前面所有非空节点都没有下一层节点。#这两个条件,树才是完全二叉树
bool isCompleteTree(TreeNode* root) {
// write code here
if (root == nullptr) {
return true;
}
list<TreeNode*> li; //记录每一层的节点
li.push_back(root);
bool tag = true; //如果list中任意节点的下一层节点为空则置为false
while (tag) { //循环结束后,list记录第一次出现空节点的那一层节点
int size = li.size();
while (size--) {
if (li.front()->left == nullptr || li.front()->right == nullptr) {
tag = false;
}
li.push_back(li.front()->left);
li.push_back(li.front()->right);
li.pop_front();
}
}
TreeNode* p = li.front(); //循环结束后,list记录第一次出现空节点的那一层节点
li.pop_front();
while (!li.empty()) {
if (p != nullptr && isBranchEmpty(p) == false) { //如果一个节点不为空,节点下一层存在节点,证明不是完全树
return false;
}
if (p == nullptr && li.front() != nullptr) { //如果上一个节点为空,下一个节点不为空,证明不是完全树
return false;
}
p = li.front();
li.pop_front();
}
return true;
}
};
查看29道真题和解析