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

LeetCode222_完全二叉树的结点个数

LeetCode222_完全二叉树的结点个数

  • 标签:#位运算 #树 #二分查找 #二叉树
    • Ⅰ. 题目
    • Ⅱ. 示例
  • 0. 个人方法

标签:#位运算 #树 #二分查找 #二叉树

Ⅰ. 题目

  • 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

  • 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2^h 个节点。

Ⅱ. 示例

· 示例 1:
在这里插入图片描述
输入:root = [1,2,3,4,5,6]
输出:6

· 示例 2:
输入:root = []
输出:0

· 示例 3:
输入:root = [1]
输出:1

0. 个人方法

根据完全二叉树最后一层的结点 都集中在该层最左边的若干位置 这一特点来做文章。

  1. 如果左子树和右子树的高度相同(左、右都是满的),左子树一定是一个 满二叉树,节点个数为 2^h - 1。继续递归判断右子树的左子树和右子树…;
  2. 若不同,则右子树是满的,继续递归判断左子树的左子树和右子树…。
/*** 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 getHeight(TreeNode* root) {int h = 0;while (root) {h++;root = root->left;}return h;}int countNodes(TreeNode* root) {if (!root) return 0;int leftHeight = getHeight(root->left);int rightHeight = getHeight(root->right);if (leftHeight == rightHeight)return (1 << leftHeight) + countNodes(root->right);elsereturn (1 << rightHeight) + countNodes(root->left);}
};

PS:“1 << leftHeight” 表示将 1 左移 leftHeight 位,即表示 2leftHeight(左子树的结点数为 2leftHeight-1,根结点为 1)

  • 时间复杂度分析
    • getHeight() 时间是 O(log n)(树高);

    • 每一层递归时 getHeight 被调用两次,最多递归 log n 层;

    • 总时间复杂度为 O((log n)^2) —— 比普通 O(n) 的遍历快很多;

http://www.lryc.cn/news/2384297.html

相关文章:

  • STM32之温湿度传感器(DHT11)
  • 在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建
  • 2025版 JavaScript性能优化实战指南从入门到精通
  • FluxCD入门操作文档
  • DOM API-JS通过文档对象树操作Doc和CSS
  • 实现了TCP的单向通信
  • PostgreSQL中通过查询数据插入到表的几种方法( SELECT INTO和INSERT INTO ... SELECT)
  • STM32项目实战:ADC采集
  • CYT4BB Dual Bank - 安全启动
  • Windows系统下MySQL 8.4.5压缩包安装详细教程
  • 科技行业智能化升级经典案例—某芯片公司
  • Python编程从入门到实践 PDF 高清版
  • 互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战
  • MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则
  • ⚡ Linux Debian 安装与配置 Docker
  • 系统性能不达标,如何提升用户体验?
  • 《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》
  • Sentinel原理与SpringBoot整合实战
  • 智能守护校园“舌尖安全“:AI视频分析赋能名厨亮灶新时代
  • c++ 模板技巧——类型萃取
  • 初步尝试AI应用开发平台——Dify的本地部署和应用开发
  • 卷积神经网络中的局部卷积:原理、对比与应用解析
  • 重拾童年,用 CodeBuddy 做自己的快乐创作者
  • MyBatis-Plus的自带分页方法生成的SQL失败:The error occurred while setting parameters
  • Redis 的速度为什么这么快
  • HarmonyOS实战:自定义时间选择器
  • Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)
  • 6:OpenCV—图像滤波
  • pytorch语法学习
  • 5:OpenCV—图像亮度、对比度变换