https://leetcode.com/problems/count-complete-tree-nodes/description/
简单的二分法分治,探测(子)树的左右侧是否相等即可。
(下面代码没实现)想要更快的话,其实自从第一次算出左侧的深度后,后面的左测深度直接可以通过减法求出,不用再去探测一次了。
/**
* 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 countLevel(TreeNode* root, bool to_left) {
int count = 0;
while (root != nullptr)
{
count++;
root = to_left ? root->left : root->right;
}
return count;
}
int countNodes(TreeNode* root) {
if (root == nullptr)
return 0;
int lvl_left = countLevel(root, true);
int lvl_right = countLevel(root, false);
if (lvl_left == lvl_right)
{
// finally
return (1 << lvl_left) - 1; // 2^n - 1
}
else
{
return 1 + countNodes(root->left) + countNodes(root->right);
}
}
};