leetcode 222.完全二叉树的节点个数
题干
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/
2 3
/ \ /
4 5 6
输出: 6
题解
毕竟完全二叉树,很容易想到分层处理,于是用bfs写的代码出现了
class Solution {
public:
int countNodes(TreeNode* root) {
int ans = 0;
if(root == nullptr){
return 0;
}
queue<TreeNode*> level;
level.push(root);
ans++;
while(!level.empty()){
auto now = level.front();
level.pop();
if(now->left != nullptr){
level.push(now->left);
ans++;
}
if(now->right != nullptr){
level.push(now->right);
ans++;
}
if(now->left == nullptr || now->right == nullptr){
return ans;
}
}
return ans;
}
};
完全二叉树的位运算属实妙啊:
1.从1开始,从上到下从左到右给节点标号
2.节点所对应的标号的二进制位数即为节点所在层数,较低的几位为根节点到该节点的路径,向右为1,向左为0
3.如1100表示12号节点,最高位的1表示12号节点位于第四层,100表示可从根节点->right->left->left的路径访问到
官方题解:
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int level = 0;
TreeNode* node = root;
while (node->left != nullptr) {
level++;
node = node->left;
}
int low = 1 << level, high = (1 << (level + 1)) - 1;
while (low < high) {
int mid = (high - low + 1) / 2 + low;
if (exists(root, level, mid)) {
low = mid;
} else {
high = mid - 1;
}
}
return low;
}
bool exists(TreeNode* root, int level, int k) {
int bits = 1 << (level - 1);
TreeNode* node = root;
while (node != nullptr && bits > 0) {
if (!(bits & k)) {
node = node->left;
} else {
node = node->right;
}
bits >>= 1;
}
return node != nullptr;
}
};