最简单的办法就是递归,代码如下:
class Solution {
public:
int countNodes(TreeNode* root) {
if (!root)
return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
};
但是递归效率很低,尤其在这道题中,告诉你是完全二叉树就应该想到怎么用完全二叉树的公式进行计算,更高效的解法如下:
完全二叉树的高度可以直接通过不断地访问左子树就可以获取
判断左右子树的高度:
- 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
- 如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中
代码实现:
class Solution {
public:
int countNodes(TreeNode* root) {
if (!root)
return 0;
int ldep = depth(root->left);
int rdep = depth(root->right);
if (ldep == rdep)
return (1 << ldep) + countNodes(root->right); // 1(根节点) + 2^ldep - 1(左完全左子树节点数) + 右子树节点数量
else
return (1 << rdep) + countNodes(root->left); // 1(根节点) + 2^rdep - 1(右完全右子树节点数) + 左子树节点数量
}
private:
int depth(TreeNode* root) {
int depth = 0;
while (root != nullptr) {
++depth;
root = root->left;
}
return depth;
}
};