【二叉树】Leetcode 222. 完全二叉树的节点个数【简单】

完全二叉树的节点个数

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

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

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

解题思路

树的高度:

  • 计算树的高度可以在 O(log n) 时间内完成,通过沿着左子树一直走到底。

完全二叉树的性质

  • 对于完全二叉树,如果左右子树的高度相同,那么左子树一定是满二叉树,可以直接计算其节点数;
  • 如果左右子树的高度不同,那么右子树一定是满二叉树。

递归计算:

  • 根据左右子树的高度关系,递归地计算左右子树的节点数,直到叶节点。

Java实现

public class CountNodes {public static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}/** 二叉树的节点数 */public int countNodes(TreeNode root) {if (root == null) {return 0;}int leftDepth = computeDepth(root.left);int rightDepth = computeDepth(root.right);if (leftDepth == rightDepth) {// 左子树是满二叉树return (1 << leftDepth) + countNodes(root.right);} else {// 右子树是满二叉树return (1 << rightDepth) + countNodes(root.left);}}/** 二叉树的深度 */private int computeDepth(TreeNode node) {int depth = 0;while (node != null) {node = node.left;depth++;}return depth;}public static void main(String[] args) {CountNodes countNodes = new CountNodes();// 构建示例完全二叉树TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right.left = new TreeNode(6);// 计算完全二叉树的节点个数int result = countNodes.countNodes(root);System.out.println("Number of nodes: " + result);  // 输出: 6}
}

时间空间复杂度

  • 时间复杂度:O(log n * log n),每次递归调用都减少一半节点,递归的次数logn,且需要计算树的高度logn。
  • 空间复杂度:O(log n),递归栈的深度等于树的高度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生_K8S系列】什么是 Kubernetes Pod?用实际例子解释

Kubernetes&#xff08;简称K8S&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化容器化应用的部署、扩展和管理。在Kubernetes中&#xff0c;Pod是最小的部署单元。理解Pod的概念对于掌握Kubernetes至关重要。本篇文章将详细解释什么是Kubernetes Pod&#xff0c;并…

数字孪生概念、数字孪生技术架构、数字孪生应用场景,深度长文学习

一、数字孪生起源与发展 1.1 数字孪生产生背景 数字孪生的概念最初由Grieves教授于2003年在美国密歇根大学的产品全生命周期管理课程上提出&#xff0c;并被定义为三维模型&#xff0c;包括实体产品、虚拟产品以及二者间的连接&#xff0c;如下图所示&#xff1a; 2011年&…

【机器学习】机器学习在深度学习领域中的作用:半监督学习的视角

&#x1f440;时空之门&#x1f440; &#x1f50d;引言&#x1f388;半监督学习概述&#x1f69d;机器学习在深度学习领域中的作用☘特征提取与表示学习&#x1f340;复杂任务建模❀结合半监督学习提升性能 &#x1f680;半监督学习在深度学习中的应用场景&#x1f4d5;图像识…

反弹shell检测的一些思路

前言 反弹shell是攻击者常用的手段之一&#xff0c;通过反弹Shell&#xff0c;攻击者可以绕过防火墙&#xff0c;获取目标系统的shell访问权限&#xff0c;进行后续的恶意操作。因此&#xff0c;及时检测并阻止反弹Shell行为对于安全防护来说非常重要。本文通过介绍反弹shell的…

Baidu Comate帮开发者“代码搬砖”,2天搞定原先3周工作量

日常项目基础工作耗费大量时间、紧急任务一连“肝”几个大夜……对于一个计算机相关专业研究生来说&#xff0c;几乎是家常便饭。随着大模型能力赋能编码工具&#xff0c;被开发者们戏称的“代码搬砖”生活有了起色。 从去年开始&#xff0c;PPDE 飞桨开发者技术专家、澳门理工…

CV每日论文---2024.6.3

1、Video-MME: The First-Ever Comprehensive Evaluation Benchmark of Multi-modal LLMs in Video Analysis 中文标题&#xff1a;Video-MME&#xff1a;视频分析领域首个多模态法学硕士综合评估基准 简介&#xff1a;Video-MME 是一个全面评估多模态大语言模型&#xff08;M…

day54_60

1.判断子序列 class Solution {public boolean isSubsequence(String s, String t) {if (s.length() 0) return true;for (int i 0, j 0; j < t.length(); j) {if (s.charAt(i) t.charAt(j)) {// 若已经遍历完 s &#xff0c;则提前返回 trueif (i s.length())return …

MAX7219(模拟SPI)驱动灯环的简单应用

文章目录 一、MAX7219是什么&#xff1f;二、使用步骤1.硬件1.1 引脚说明1.2 应用电路1.2.1 驱动数码管1.2.2 驱动点阵 2.软件2.1 时序2.2 寄存器2.2.1 掉电寄存器2.2.2 译码模式寄存器2.2.3 亮度寄存器2.2.4 扫描寄存器2.2.5 显示测试寄存器 2.3 初始化2.4 控制左侧灯环特定位…

一个小时搞定JAVA面向对象(5)——抽象与接口

文章目录 抽象抽象的注意事项static\final\private是否可以修饰抽象方法继承和抽象知识点回顾 接口接口实现总结抽象方法默认方法静态方法成员变量接口的特点接口和抽象类的区别 抽象 关键字: abstract 抽象方法: 修饰符 abstract 返回值类型 方法名(参数); 抽象类: public a…

大厂起诉了,协商拿了2N,整理点经验心得给大家,关于离职时如何让自己利益最大化!...

离职时&#xff0c;如何让自己的利益最大化&#xff1f; 一位跟大厂仲裁&#xff0c;并通过协商拿到2n的网友分享了自己的经验心得&#xff0c;干货满满&#xff0c;下面是要点总结&#xff1a; 1.大部分裁员都是违法裁员&#xff0c;应该给2n&#xff0c;但公司不会承认&…

oracle获取去年的第12月第一天

要获取去年的12月份的第一天&#xff0c;你可以使用ADD_MONTHS和TRUNC函数组合。这里是一个简单的SQL查询&#xff0c;它将返回去年的12月1日&#xff1a; sql复制代码 SELECT TRUNC(ADD_MONTHS(TRUNC(SYSDATE, YYYY), -1), MM) AS first_day_of_last_december FROM dual; 在…

【代码随想录——贪心算法——二周目】

1.买卖股票的最佳时间② 思路&#xff1a;构建每两天之间的利润之差&#xff0c;如果是正数则一直累加即可。 体现出来场景是&#xff0c;如果理论一直为正&#xff0c;则说明我们需要一直持有股票。当出现负数时&#xff0c;代表我们应该在前一天卖出。当出现正数时我们应该在…

客户端打开浏览器post提交数据

客户端请求url提交post数据的方式很多, 例如HttpWebRequest,HttpClient, 或者第三方的RestSharp以及Flurl 等. 使用也比较简单方便,资料一搜一大堆,不重点写了. 这里主要记录一种使用客户端登录,并且点击触发单点登录到浏览器页面跳转的一种方式. 客户端程序可以轻松启动电…

【耗时十个小时】程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!

❤ 纯 干 货 ❤ 在这之前咱们已经接触了 各个算法的优缺点的总结&#xff0c;以及8个回归类算法、7个正则化算法的总结、5 个集成算法模型的全部总结&#xff01; 感兴趣的可以翻到之前看看~ 咱们今天就大概一起学习一下关于SVM的方方面面。 线性支持向量机 非线性支持向量…

【全开源】Java同城服务同城信息同城任务发布平台小程序APP公众号源码

&#x1f4e2; 连接你我&#xff0c;让任务触手可及 &#x1f31f; 引言 在快节奏的现代生活中&#xff0c;我们时常需要寻找一些便捷的方式来处理生活中的琐事。同城任务发布平台系统应运而生&#xff0c;它为我们提供了一个高效、便捷的平台&#xff0c;让我们能够轻松发布…

Python笔记 - Lambda表达式

探索Python中的Lambda表达式 在Python编程中&#xff0c;lambda表达式是一种简洁而强大的工具&#xff0c;用于创建匿名函数。与普通函数不同&#xff0c;lambda函数没有名称&#xff0c;仅由一个表达式组成。本文将通过多个具体的代码示例&#xff0c;深入介绍lambda表达式的…

三、生成RPM包

文章目录 1、编译生成so、bin 通过此工程编译生成so\bin文件 2、将so\bin打包到rpm中 ###### 1.生成可执行文件、库文件 ######### cmake_minimum_required(VERSION 3.15)project(compute) set(target zls_bin) set(target2 libcompute.so) # 依赖的头文件 include_directori…

QStringList和QLIst<QString>有什么区别

定义和关系&#xff1a; QStringList 是 QList 的一个typedef&#xff0c;本质上是 QList 的一个特化。这意味着 QStringList 继承了 QList 的所有功能和特性。 在Qt 5及更早版本中&#xff0c;QStringList 被广泛使用&#xff0c;因为它提供了一些专门处理字符串的便利功能&a…

ATA-2081高压放大器选型时注意事项是什么

高压放大器是一类特殊设计的放大器&#xff0c;用于放大高电压信号。在选择高压放大器时&#xff0c;需要考虑多个因素&#xff0c;以确保所选设备符合应用需求并能够提供稳定、可靠的性能。下面安泰电子官网将详细介绍在高压放大器选型过程中需要注意的关键事项。 一、电压范围…

【机器学习数据挖掘】基于自回归积分滑动平均模型的疫情分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 数据分析 数据来自法国疫情数据 数据预处理 建立模型 模型预测 资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 代码详解 完整代码文件 主…