【代码随想录day 15】 力扣 222.完全二叉树的节点个数

视频讲解: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;
    }
};