【二叉树】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…

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 控制左侧灯环特定位…

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

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

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

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

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

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

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

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

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

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

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

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

luckysheet的使用

前言 公司新需求要一个在线的excel编辑器 一、luckysheet是什么&#xff1f; LuckySheet是一款基于Web的在线表格组件&#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源结合Vue3可以实现数据的动态展示和编辑&#xff0c;为用户提供良好的…

2024年澳大利亚科学院新增院士名单和两位华人学者简介

近日&#xff0c;澳大利亚科学院公布了2024年新当选的24位院士名单&#xff0c;他们也是访问学者、博士后及联合培养博士们关注的目标导师。为此知识人网小编推出该文&#xff0c;以飨读者。 5月 23 日&#xff0c;2024年澳大利亚科学院&#xff08;the Australian Academy of…

【企业开发】大屏的响应式处理

【企业开发】大屏的响应式处理 如图&#xff1a; 响应式工具封装 // 等比缩放方式屏幕适配 export function screenAdaptive(designWidth 1920, designHeight 1080) {const screenWidth document.documentElement.clientWidth || document.body.clientWidthconst screenHeig…

【数据结构】 排序算法总结,直接选择排序详解!

文章目录 1. 排序几个重点概念的理解2. 排序算法的分析&#x1f427;3.直接选择排序 1. 排序几个重点概念的理解 2. 排序算法的分析&#x1f427; 3.直接选择排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交换的时候&#xff0c;要及时更新 maxi &#x1f34e;…

java同步

Java中的同步是指在多线程编程中&#xff0c;用来控制多个线程对共享资源的访问&#xff0c;以避免数据不一致的问题。Java提供了多种同步机制来确保线程安全。以下是Java同步的详细讲解&#xff1a; 1. synchronized关键字 synchronized关键字是Java中最常见的同步机制&…

计算机专业本科就业还是考研?考研有哪些热门方向?

考研并不是一个逃避就业的避难所&#xff0c;也不是一个简单的提升待遇的手段。考研是提升自我的途径&#xff0c;特别是对于那些对特定技术领域有浓厚兴趣并愿意深入研究的人来说 一个本科生能够认真学三年&#xff0c;那么他们所掌握的技能和知识不应该逊色于那些通过短期培…

Solidworks 提取模型中的零件,并组合成一个新的零件,放入特征库

对方发来一个STP文件&#xff0c;其中有模型的部分零件想为我所用。 Shift键鼠标左键 选取需要的零件 在选好零件上右键&#xff0c;选择“孤立” 左边找到部件&#xff0c;ctrl左键选中&#xff0c;选择“插入到新零件” 点 绿色 勾 就选择保存类型&#xff0c;完成 。 打开这…