/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 */ bool isCompleteTree(TreeNode* root) { // write code here // 广度优先搜索 deque<TreeNode*> d; d.emplace_back(root); int h=1; // 看看是否是最后一层 bool flag = false; while(!d.empty()) { int len=d.size(); // cout<<h<<", "<<len<<endl; // 可能达到最后一层了 if(h!=len) { // 前面已经有一层不满足节点达到最大个数了 if(!flag) flag = true; else { cout<< "1" << endl; return false; } } bool flag_temp = false; for(int i=0;i<len;++i) { // 有右子树但是没有左子树 if(!d.front()->left && d.front()->right) { cout<< "2" << endl; return false; } // 当前行遇到了子树残缺的节点,那么后面的节点理应没有子树 if(!flag_temp) { if(!d.front()->left || !d.front()->right) flag_temp = true; } // 改行已经遇到一个左右节点的节点了,但是后面的节点还有左右节点; else { if(d.front()->left || d.front()->right) return false; } if(d.front()->left) d.emplace_back(d.front()->left); if(d.front()->right) d.emplace_back(d.front()->right); d.pop_front(); } h *= 2; } return true; } };