958. Check Completeness of a Binary Tree
解法
这里主要还是要清楚完全二叉树的定义。从层的视角来看,所有节点都是左对齐的,并且中间不能出现空位,因为我们可以通过层序遍历来解题。
代码
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:bool isCompleteTree(TreeNode* root) {if (!root) return true;queue<TreeNode *> q;q.push(root);bool is_leaf = false;while(q.size()) {auto n = q.front();q.pop();// 叶子节点if (!n->left && !n->right) {is_leaf = true;continue;}// 期望是叶子节点,但该节点仍然有儿子if (is_leaf && (n->right || n->left)) {return false;}// 右儿子存在,左儿子不存在,有空缺if (n->right && !n->left) {return false;}// 左儿子存在,右儿子不存在,有空缺,之后出现的所有节点应该是叶子节点if (n->left && !n->right) {is_leaf = true;}if (n->left) q.push(n->left);if (n->right) q.push(n->right);}return true;}};
- 下面这种方式更直观,把左右儿子一股脑塞进队列,如果出现了一个空位,之后必须全是空位
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:bool isCompleteTree(TreeNode* root) {if (!root) return true;queue<TreeNode *> q;q.push(root);bool is_leaf = false;while(q.size()) {auto n = q.front();q.pop();if (!n) {while(q.size()) {auto m = q.front();q.pop();if (m) {return false;}}continue;}q.push(n->left);q.push(n->right);}return true;}};
