【Day-28慢就是快】代码随想录-二叉树-完全二叉树的节点个数

news2024/11/25 3:30:41

给出一个完全二叉树,求出该树的节点个数。

——————————————————————————————————————

1. 普通二叉树的求法

递归法与求深度类似,但是深度是depth++,而此题是计算nodeNum。

迭代法使用层序遍历,记录遍历的节点个数即可。

递归法

迭代法

层序遍历的模板是通用的,不一定只适用完全二叉树。

2. 完全二叉树的求法

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

这里关键在于如何去判断一个左子树或者右子树是不是满二叉树呢?

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图:

在递归逻辑中,第二步的终止条件为:判断左右子树的深度是否相等来判断是否为满二叉树。

if (root == nullptr) return 0; 
// 开始根据左深度和右深度是否相同来判断该子树是不是满二叉树
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left) {  // 求左子树深度
    left = left->left;
    leftDepth++;
}
while (right) { // 求右子树深度
    right = right->right;
    rightDepth++;
}
if (leftDepth == rightDepth) {
    return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量
}

单层递归的逻辑则是后序遍历,求节点数。

return countNodes(root->left) + countNodes(root->right) + 1; 

整体的迭代法:

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

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

相关文章

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)5 - 总结

SAP 中在库移动 不仅有入库&#xff08;GR&#xff09;&#xff0c;出库&#xff08;GI&#xff09;&#xff0c;也可以是单纯内部的转记或转送。 1&#xff0c;振替转记&#xff08;转移过账&#xff09; 具体查看我之前的文章。 SAP MM学习笔记26- SAP中 振替转记&#xff…

大数据可视化大屏实战项目(2)公司季度销售额度可视化展示—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

大数据可视化大屏实战项目&#xff08;2&#xff09;公司季度销售额度可视化展示—HTMLCSSJS【源码在文末】&#xff08;可用于比赛项目或者作业参考中&#x1f415;&#x1f415;&#x1f415;&#xff09; 一&#xff0c;项目概览 ☞☞☞☞☞☞项目演示链接&#xff1a;htt…

Kerberos基础

一. Kerberos概述 Kerberos是一种计算机网络授权协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构&#xff0c;并且能够进行相互认证&#xff0c…

软件工程学术顶会——ESEC/FSE 2022 议题(网络安全方向)清单、摘要与总结

总结 本次会议中网络安全相关议题涵盖区块链、智能合约、符号执行、浏览器API模糊测试等不同研究领域。 热门研究方向: 1. 基于深度学习的漏洞检测与修复 2. 基于AI的自动漏洞修复 3. 模糊测试与漏洞发现 冷门研究方向: 1. 多语言代码的漏洞分析 2. 代码审查中的软件安全 3. 浏…

【类和对象】③友元类

文章目录 1.初始化列表2.static静态成员3.友元 1.初始化列表 我们知道在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。虽然调用构造函数之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成…

长胜证券:医药逐步走出疫情扰动 潜心静气迎接曙光

8月回顾&#xff1a;2023年8月医药生物板块跌落4.76%&#xff0c;同期沪深300跌落6.21%&#xff0c;医药板块跑赢沪深300约1.45%&#xff0c;位列31个子职业第11位。本月子板块医疗服务、中药、医药商业、化学制药、医疗器械、生物制品分别跌落1.47%、3.20%、3.97%、5.18%、7.2…

关于ChatGPT:4个维度讲透 ChatGPT 技术原理,揭开 ChatGPT 神秘技术黑盒!(文末送书福利5.0)

文章目录 &#x1f4cb;前言&#x1f3af;Tansformer架构模型&#x1f3af;ChatGPT原理&#x1f3af;提示学习与大模型能力的涌现&#x1f9e9;提示学习&#x1f9e9;上下文学习&#x1f9e9;思维链 &#x1f3af;行业参考建议&#xff08;关于本书&#xff09;&#x1f9e9;拥…

Python爬取天气数据并进行分析与预测

随着全球气候的不断变化&#xff0c;对于天气数据的获取、分析和预测显得越来越重要。本文将介绍如何使用Python编写一个简单而强大的天气数据爬虫&#xff0c;并结合相关库实现对历史和当前天气数据进行分析以及未来趋势预测。 1 、数据源选择 选择可靠丰富的公开API或网站作…

QT中闹钟的设置

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮 #include <QTextEdit> //文本 #include <QLabel> //标签 #include <QLineEdit> //行编辑器#include <QTimerEvent> //定时器事件类头文件 #…

串联系统与并联系统可靠性计算

串联系统 计算串联系统可靠性&#xff0c;就将所有部分的可靠性相乘即可 并联系统 计算并联系统可靠性&#xff0c;就用每个部分的不可靠性相乘&#xff0c;得到系统的不可靠性&#xff0c;再用1-不可靠性&#xff0c;得到并联系统可靠性 串&#xff0c;并联系统 上图的系统可…

深入剖析Kubernetes之控制器模式

文章目录 Kubernetes 项目中一个重要的设计思想&#xff1a;控制器模式。 nginx-deployment 的例子&#xff1a; apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:matchLabels:app: nginxreplicas: 2template:metadata:labels:app: ngin…

做外贸如何引导跟进客户

跟客户聊什么似乎是我们很多小伙伴很头疼的问题&#xff0c;尤其是需要跟客户follow-up 的时候&#xff0c;那种没话找话的感觉有时候都令自己抓狂。 如果我们自己的产品本身比较负责&#xff0c;设计到的工艺或者款式以及规格很多的时候&#xff0c;那可能话题就还容易一些&a…

初级电工电子基础知识部分

欢迎学习初级电工电子基础知识部分 学习可不能像是看小说那样看完就过了&#xff0c;作为电工学的开篇&#xff0c;同时作为电工技术这个特殊作业工种&#xff0c;理解并记住每个知识点是很重要的&#xff0c;因为电工基础里面很多都是理论知识&#xff0c;前面的没掌握好后面的…

算法基础-数学知识-质数、约数

这里写目录标题 质数试除法判定质数晒质数埃及筛线性筛 约数试除法求约数约数个数与约数之和AcWing 870. 约数个数AcWing 871. 约数之和 欧几里德求最大公因数 质数 埃及筛虽然用的不多&#xff0c;大多使用线性筛&#xff0c;但是埃及筛的思想很重要 试除法判定质数 AcWin…

大数据可视化大屏实战项目(4)物流数据云看台(包括动态登陆页面)—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

大数据可视化大屏实战项目&#xff08;4&#xff09;物流数据云看台&#xff08;包括动态登陆页面&#xff09;—HTMLCSSJS【源码在文末】&#xff08;可用于比赛项目或者作业参考中&#x1f415;&#x1f415;&#x1f415;&#xff09; 一&#xff0c;项目概览 ☞☞☞☞☞☞…

软件测试案例 | 某教务管理平台系统的系统测试总结报告

集成测试通过之后&#xff0c;各个模块已经被组装成了一个完整的软件包&#xff0c;这时就需要进行系统测试了。传统的系统测试指的是通过集成测试的软件系统&#xff0c;作为计算机系统的一个重要组成部分&#xff0c;其将与计算机硬件、外部设备、支撑软件等其他系统元素组合…

信息安全性测试的流程

安全测试 一、信息安全性测试的定义 软件安全是一个广泛而复杂的主题&#xff0c;每一个新软件都可能存在安全的缺陷&#xff0c;甚至这个缺陷是前所未见的。信息安全性测试的目的在于通过系统的测试&#xff0c;对所测软件提出安全改进建议&#xff0c;帮助用户将风险控制/转…

图片转Excel表格神器的黑科技探索

哇塞&#xff0c;图片转Excel表格真的太酷了&#xff01;这种技术能让我们的图片信息变得井井有条&#xff0c;方便后续的数据分析和处理。想知道一般我们会用哪些技术来实现这个功能吗&#xff1f;以金鸣识别为例&#xff0c;让我们一起来聊聊吧&#xff01; 首先&#xff0c…

【ES6】Class中this指向

先上代码&#xff1a; 正常运行的代码&#xff1a; class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出&#xff1a; 单独调用函数p…

【PDF密码】没有密码,可以解密PDF文件吗?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。想要解密&#xff0c;我们需要输入正确的密码&#xff0c;但是有时候我们可能会出现忘记密码的情况&#xff0c;或者网上下载P…