给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
采用递归方法遍历树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int countNodes(struct TreeNode* root)
{
if(root)
{
return countNodes(root->left)+countNodes(root->right)+1;
}
else return 0;
}
Leetcode官网给出了一种二分查找+位运算的解法
c语言写法
/**
* 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;
}
JavaScript写法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
const exists = (root, level, k) => {
let bits = 1 << (level - 1);
let node = root;
while (node !== null && bits > 0) {
if (!(bits & k)) {
node = node.left;
} else {
node = node.right;
}
bits >>= 1;
}
return node !== null;
}
var countNodes = function(root) {
if (root === null) {
return 0;
}
let level = 0;
let node = root;
while (node.left !== null) {
level++;
node = node.left;
}
let low = 1 << level, high = (1 << (level + 1)) - 1;
while (low < high) {
const mid = Math.floor((high - low + 1) / 2) + low;
if (exists(root, level, mid)) {
low = mid;
} else {
high = mid - 1;
}
}
return low;
};