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. 个人方法
根据完全二叉树最后一层的结点 都集中在该层最左边的若干位置 这一特点来做文章。
- 如果左子树和右子树的高度相同(左、右都是满的),左子树一定是一个 满二叉树,节点个数为 2^h - 1。继续递归判断右子树的左子树和右子树…;
- 若不同,则右子树是满的,继续递归判断左子树的左子树和右子树…。
/*** 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) 的遍历快很多;
-
相关文章:

LeetCode222_完全二叉树的结点个数
LeetCode222_完全二叉树的结点个数 标签:#位运算 #树 #二分查找 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#位运算 #树 #二分查找 #二叉树 Ⅰ. 题目 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下&…...

STM32之温湿度传感器(DHT11)
KEIL软件实现printf格式化输出 一般在标准C库是提供了格式化输出和格式化输入等函数,用户想要使用该接口,则需要包含头文件 #include ,由于printf函数以及scanf函数是向标准输出以及标准输入中进行输出与输入,标准输出一般指的是…...

在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建
在微创手术中,Kinova轻型机械臂通过其灵活的运动控制和高精度的操作能力,支持多视图图像采集和3D重建。这种技术通过机械臂搭载的光学系统实现精准的多角度扫描,为医疗团队提供清晰且详细的解剖结构模型。其核心在于结合先进的传感器配置与重…...
2025版 JavaScript性能优化实战指南从入门到精通
JavaScript作为现代Web应用的核心技术,其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面,提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一: // 不好的做法&#x…...
FluxCD入门操作文档
文章目录 FluxCD使用文档一、入门1.1 什么是FluxCD1.2 什么是GitOps1.3 什么是持续交付1.4 什么是**Source(源)**1.5 **什么是Reconciliation(协调)**1.6 什么是**Kustomization****与 kustomize 工具的区别**1.7 什么是**Bootstrap(引导)**1.8 安装Flux CLI1.9 配置flux…...

DOM API-JS通过文档对象树操作Doc和CSS
还记得我在之前的前端文章里面老是提及的 DOM 吗,当时只是简单介绍了它的组成以及作用,今天我们就来详细聊聊 Web浏览器 先来聊聊web浏览器,web浏览器是非常复杂的软件,有许多活动部件,许多部件并不能由开发者通过 J…...
实现了TCP的单向通信
1. 客户端代码:Client.java package com.xie.javase.net1;import java.io.*; import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;BufferedWriter bw = null;try {// 1. 获取本机IP地址对象InetAddress localHost = Inet…...
PostgreSQL中通过查询数据插入到表的几种方法( SELECT INTO和INSERT INTO ... SELECT)
使用 SELECT INTO 创建新表 在PostgreSQL中,SELECT INTO语法有两种主要用途:创建新表和将查询结果存储到变量中(在PL/pgSQL函数或存储过程中)。以下是详细介绍: 1. 创建新表并复制数据(类似SQL标准) SELECT * INTO new_table FROM existing_table WHERE condition;说…...
STM32项目实战:ADC采集
STM32F103C8T6的ADC配置。PB0对应的是ADC1的通道8。在标准库中,需要初始化ADC,设置通道,时钟,转换模式等。需要配置GPIOB的第0脚为模拟输入模式,然后配置ADC1的通道8,设置转换周期和触发方式。 接下来是I2C…...

CYT4BB Dual Bank - 安全启动
本节介绍TRAVEO™ T2G微控制器(MCU)的启动顺序。有关TRAVEO™ T2G微控制器的安全特性、不同的生命周期阶段以及“安全启动”序列的详细描述,请参阅 AN228680 -Secure system configuration in TRAVEO™ T2G family. TRAVEO™ T2G微控制器(MCU)的启动序列(见图3)基于…...
Windows系统下MySQL 8.4.5压缩包安装详细教程
一、MySQL 8.4.5新特性概览 相较于旧版本,MySQL 8.4.5在性能与功能上实现了显著提升: 性能优化:官方测试显示,在高并发场景下,其读写性能较5.7版本提升近2倍,尤其在处理热点数据竞争问题时表现更为出色。…...

科技行业智能化升级经典案例—某芯片公司
案例标题 CSGHub赋能某芯片公司:国产AI芯片全链路管理平台的高效落地与生态共建 执行摘要 某芯片公司在开发内部模型管理平台时,选择AgenticOps体系中的CSGHub作为核心工具,通过其本地化部署能力、中文支持及RESTful API接口,解决…...

Python编程从入门到实践 PDF 高清版
各位程序员朋友们,还在为找不到合适的Python学习资料而烦恼吗?还在为晦涩难懂的编程书籍而头疼吗?今天,就给大家带来一份重磅福利——237完整版PDF, 我用网盘分享了「Python编程:从入门到实践__超清版.pdf…...
互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战
互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战 引言 在当前快速发展的互联网行业中,Java开发者在面对复杂的分布式系统设计时,需要掌握从微服务架构到AI模型集成的多种技能。本文通过一场模拟面试,深入探讨了基于…...
MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则
最左前缀法则 联合索引中,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,索引将会部分失效(后面的字段索引失效)举例假设有一个联合索引包含三个字段按顺序:…...
⚡ Linux Debian 安装与配置 Docker
🐧 Linux Debian 安装与配置 Docker 📦 1. Docker 简介 Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个标准化的镜像中,然后在任何地方快速部署和运行。 Docker 利用了 Linux 的 容器技术(N…...

系统性能不达标,如何提升用户体验?
当系统性能不达标时,要想有效提升用户体验,必须从性能优化、前后端协同、用户感知改善、监控预警机制四个关键维度切入。其中,性能优化是最直接有效的策略,它通过代码优化、资源压缩、缓存机制、CDN加速等手段,显著提升…...
《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》
《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》 一、引言 在当今数字化的时代背景下,Linux操作系统凭借其卓越的性能、可靠性和开源的优势,在服务器、云计算、嵌入式系统等众多领域占据着举足轻重的地位。对于IT运维…...
Sentinel原理与SpringBoot整合实战
前言 随着微服务架构的广泛应用,服务和服务之间的稳定性变得越来越重要。在高并发场景下,如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件,提供了从流量控制、熔断降级、…...

智能守护校园“舌尖安全“:AI视频分析赋能名厨亮灶新时代
引言: 在校园食品安全备受关注的今天,一套融合视频监控管理平台与AI视频分析盒子的智能解决方案正在全国多地学校食堂悄然落地,为传统的"名厨亮灶"工程注入科技新动能。这套系统不仅实现了后厨操作的"透明化"࿰…...
c++ 模板技巧——类型萃取
//traits.h/*制定输入 - 输出类型规则*/ template <class T> struct RtnType {typedef T return_type;//默认返回类型和输入类型一致 };template <class T> struct RtnType<T*> {//特化,当输入的是指针类型,返回类型规定为指针原型typ…...

初步尝试AI应用开发平台——Dify的本地部署和应用开发
随着大语言模型LLM和相关应用的流行,在本地部署并构建知识库,结合企业的行业经验或个人的知识积累进行定制化开发,是LLM的一个重点发展方向,在此方向上也涌现出了众多软件框架和工具集,Dify就是其中广受关注的一款&…...

卷积神经网络中的局部卷积:原理、对比与应用解析
【内容摘要】 本文聚焦卷积神经网络中的局部卷积,重点解析全连接、局部连接、全卷积与局部卷积四种连接方式的差异,结合人脸识别任务案例,阐述局部卷积的应用场景及优势,为理解卷积网络连接机制提供技术参考。 关键词:…...

重拾童年,用 CodeBuddy 做自己的快乐创作者
某个炎炎的夏日午后,阳光透过稀疏的树叶洒落在地上,一道道光影斑驳陆离。那时候的我们,还只是三五个小朋友,蹲坐在村头的一棵老槐树下,手里握着并不属于自己的游戏掌机,轮流按动着手柄的按键,在…...
MyBatis-Plus的自带分页方法生成的SQL失败:The error occurred while setting parameters
1、error描述 数据库是postgres,Java使用mybatis-plus的分页功能,生成的分页SQL不能正常运行。 "msg": "nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: com.baomidou.my…...
Redis 的速度为什么这么快
这里的速度快,Redis 的速度快是与 MySQL 等数据库相比较的,与直接操作内存数据相比,Redis 还是略有逊色。 Redis 是一个单线程模型,为什么比其他的多线程程序还要快,原因有以几点: 1、访问的对象不同 Re…...

HarmonyOS实战:自定义时间选择器
前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现效果 需求分析 默认…...
Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)
在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时,我们提到 flannel.1 是一个 TUN 设备,它在数据包处理中起到了关键作用。 什么是 TUN 设备? TUN 设备(Tunnel 设备)是 Linux 系统中一种虚拟网络接口&#x…...

6:OpenCV—图像滤波
过滤图像和视频 图像滤波是一种邻域运算,其中输出图像中任何给定像素的值是通过对相应输入像素附近的像素值应用某种算法来确定的。该技术通常用于平滑、锐化和检测图像和视频的边缘。 让我们了解在讨论图像过滤技术、内核和卷积时使用的一些术语的含义。 内核 内…...

pytorch语法学习
启动 python main.py --config llve.yml --path_y test -i output...