Given a complete binary tree, count the number of nodes.
Note:
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.
Example:
Input:
1
/ \
2 3
/ \ /
4 5 6
Output: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool exists(struct TreeNode* root, int level, int k) {
int bits = 1 << (level - 1);
struct TreeNode* node = root;
while (node != NULL && bits > 0) {
if (!(bits & k)) {
node = node->left;
} else {
node = node->right;
}
bits >>= 1;
}
return node != NULL;
}
int countNodes(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
int level = 0;
struct TreeNode* node = root;
while (node->left != NULL) {
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;
}
python3
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def compute_depth(self, node):
d = 0
while node.left:
node = node.left
d += 1
return d
def exists(self, idx, d, node):
left, right = 0, 2**d-1
for i in range(d):
mid = (left + right) // 2
if idx <= mid:
right = mid-1
node = node.left
else:
left = mid+1
node = node.right
return node is not None
def countNodes(self, root: TreeNode) -> int:
if not root:
return 0
d = self.compute_depth(root)
if d == 0:
return 1
left, right = 1, 2**d-1
while left <= right:
mid = (left+right) // 2
if self.exists(mid, d, root):
left = mid + 1
else:
right = mid - 1
return (2**d-1) + left
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
queue<TreeNode *>que;
int i = 0;
int size = 0;
if (root != nullptr) {
que.push(root);
}
int res = 0;
while (!que.empty()) {
size = que.size();
for (i = 0; i < size; i++) {
TreeNode *node = que.front();
que.pop();
res++;
if (node->left) {
que.push(node->left);
}
if (node->right) {
que.push(node->right);
}
}
}
return res;
}
};