leetcode刷题日记——完全二叉树的节点个数
[ 题目描述 ]:
[ 思路 ]:
- DFS,深度优先搜索,遍历树的每一个节点,统计这个节点左右两个孩子节点的个数,再加上它自己的节点个数
- 运行如下
int countNodes(struct TreeNode* root) {if(!root) return 0;int left=countNodes(root->left);int right=countNodes(root->right);return left+right+1;
}
[ 官方题解 ]:
- 方法一:二分查找 + 位运算,主要利用完全二叉树的特性来计算节点个数,最左边的节点一定处于最底层,可以先求出层高h,然后可以得出节点范围,然后通过二分查找去缩小范围,一直到正确
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;
}