使用O(logNlogN)算法时间复杂度计算完全二叉树的节点数量;
class Solution {
public:
// 算法时间复杂度为 = 算法递归深度 * 每次递归所花的时间;
// = 树的高度(O(logN)) * while循环(O(logN));
// 分解成:满二叉树和完全二叉树的节点数量计算
int countNodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
TreeNode* le = root->left, * ri = root->right;
// 记录树的高度
int hl = 1, hr = 1;
while (le != nullptr) {
le = le->left;
hl++;
}
while (ri != root->right) {
ri = root->right;
hr++;
}
// 如果左右子树高度相等,则是一棵完全二叉树
if (hl == hr) {
return pow(2, hl) - 1;
}
// 如果左右高度不同, 则按照普通二叉树逻辑计算
return 1 + countNodes(root->left) + countNodes(root->right);
}
};