当前位置: 首页 > article >正文

完全二叉树的节点个数(力扣222)

这道题可以当成一般的二叉树直接遍历,但是我们如果利用完全二叉树的特点遍历,可以节省一些时间。不过时间复杂度两者其实都是O(n)。那么所谓的特点指的是什么呢?完全二叉树只有两种情况,要么是满二叉树,要么有一部分子树是满二叉树。我们可以统计子树的左右两侧节点,来判断该子树是否是满二叉树(注意仅限于这道题可以这样判断,因为在整棵树为完全二叉树的前提下,子树如果为满二叉树,那么它的左右两侧节点的高度一定相同)。这就导致了这道题与之前的题目最大的区别就是终止条件上。在写终止条件时,要计算以该父节点为根节点的子树的两侧节点高度,如果相同,则直接退出本层递归。这是本题大致思路,大家可以结合我下面的代码以及注释理解。

代码及注释如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        //终止条件1
        if(root == NULL) return 0;
        //终止条件2
        TreeNode* left = root -> left;
        TreeNode* right = root -> right;
        int leftDepth = 0,rightDepth = 0;
        while(left != NULL){
            left = left -> left;
            leftDepth++;
        }
        while(right != NULL){
            right = right -> right;
            rightDepth++;
        }
        if(leftDepth == rightDepth){
            return (1 << leftDepth + 1) - 1;//满二叉树可以直接用公式算
        }
        //递归左子树
        int leftTreeNum = countNodes(root -> left);
        //递归右子树
        int rightTreeNum = countNodes(root -> right);
        //处理逻辑:计算左右子树节点个数,返回给当前父节点
        int result = leftTreeNum + rightTreeNum + 1;
        return result;
    }
};


http://www.kler.cn/a/517473.html

相关文章:

  • 自然语言处理——从原理、经典模型到应用
  • Work Scheduling G( 洛谷 - P2949 )
  • 【二叉树】4. 判断一颗二叉树是否是平衡二叉树。5. 对称二叉树。6. 二叉树的构建及遍历 7. 二叉树的分层遍历 。
  • 数据结构:二叉树—面试题(一)
  • 聊一聊 CSS 样式的导入方式
  • DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
  • unity 粒子系统设置触发
  • dfs专题五:FloodFill算法
  • react中hooks之 React 19 新 Hooks useOptimistic
  • linux系统下的磁盘扩容
  • 前端知识——HTML基础
  • ⚡C++ 中 std::transform 函数深度解析:解锁容器元素转换的奥秘⚡【AI 润色】
  • 低代码开发中的开源与闭源之争
  • 分数之和(题解)
  • 无人机的应用场景有哪些?
  • gesp(C++六级)(1)洛谷:P10250:[GESP样题 六级] 下楼梯
  • Java面试题2025-Spring
  • 【C语言】结构体与共用体深入解析
  • Django创建纯净版项目并启动
  • RNN实现阿尔茨海默症的诊断识别
  • 通过 Visual Studio Code 启动 IPython
  • 在K8S中,Keepalived是如何检测工作节点是否存活的?
  • redis常用命令和内部编码
  • 使用Cline+deepseek实现VsCode自动化编程
  • 51单片机——按键控制LED流水灯
  • 深度学习利用数据加载、预处理和增强数据提高模型的性能