视频讲解:https://www.bilibili.com/video/BV1eW4y1B7pD/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0222.完全二叉树的节点个数.html
力扣题目:https://leetcode.cn/problems/count-complete-tree-nodes/description/
计算二叉树的节点个数涉及到两种情况,一种情况是普通二叉树,我们使用遍历的方法来计算节点个数;另一种情况是完全二叉树,我们可以通过判断哪里开始时完全二叉树,再通过完全二叉树计算公式2^(深度)-1来直接计算节点个数,这可以大大减小计算开销。
判断是否是完全二叉树的方法:遍历左右两边子树深度,如果两边子树深度相等则证明他是完全二叉树。
cpp
class Solution {
public:
int countNodes(TreeNode* root) {
//如果根节点为空,直接返回0
if(root==NULL) return 0;
TreeNode *left=root->left;
TreeNode *right=root->right;
//初始化左右深度
int leftDepth = 0,rightDepth=0;
//一直往左节点遍历
while(left)
{
left=left->left;
leftDepth++;
}
//一直往右节点遍历
while(right)
{
right=right->right;
rightDepth++;
}
//如果左右深度相等说明他是完全二叉树,我们使用公式计算
if(leftDepth==rightDepth)
{
return (2 << leftDepth) - 1;
}
int leftresult=countNodes(root->left);
int rightresult=countNodes(root->right);
int result=leftresult+rightresult+1;
return result;
}
};