- 题目:计算一棵完全二叉树的结点数
- 难度:Medium
- 思路:根据完全二叉树的定义,只有树的最底层可能不是满的,其余层都是满的,因此需要知道二叉树的高度以及最底层结点数量;最底层结点数可以通过“判断当前节点的左子树是否存在最右孩子”来计算,如果左子树存在最右孩子则右子树也可能存在最底层孩子。
- 代码:
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == NULL) {
return 0;
}
int count = 0, height = 0;
TreeNode* tmp = root;
while (tmp != NULL) {
height++;
tmp = tmp->left;
}
int level = height - 2;
tmp = root;
while (level >= 0) {
TreeNode* left = tmp->left;
for (int i = 0; i < level; i++){
left = left->right;
}
if (left) {
tmp = tmp->right;
count += (1 << level);
} else {
tmp = tmp->left;
}
level--;
}
if (tmp) count++;
return count + (1 << height-1) -1;
}
};