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

【二叉树算法题记录】222. 完全二叉树的节点个数

题目描述

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

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

题目分析

迭代法

简单暴力直接上层次遍历!(万能的层次遍历)

/*** 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 countNodes(TreeNode* root) {// 层次遍历queue<TreeNode*> q;if(root!=NULL) q.push(root);int num = 0;    // 节点个数numwhile(!q.empty()){int size = q.size();while(size--){  // 遍历每层节点TreeNode* node = q.front();q.pop();num++;// 放入该节点下层的左右孩子if(node->left) q.push(node->left);if(node->right) q.push(node->right);}}return num;}
};

递归法

递归计算左右子树的结点个数,然后合并。

class Solution {
public:int countNodes(TreeNode* root) {// 递归遍历:每一层都在计算子树的节点数量// 递归终止条件:if(root==NULL) return 0;int left = countNodes(root->left);int right = countNodes(root->right);int total = left + right + 1;return total;}
};

不过这题有个特殊条件:完全二叉树。完全二叉树有两种情况,一种是满二叉树,另一种是最后一层叶子节点不是满的。我们知道,满二叉树的节点数是很好计算的,也就是 2 n − 1 2^n-1 2n1 n n n是深度。那么我们可以利用递归计算寻找到的满二叉树的节点数量,一层一层传上来,就得到了整体完全二叉树的节点数量。

class Solution {
public:int countNodes(TreeNode* root) {// 递归法// 递归终止条件if(root==NULL) return 0;TreeNode* left = root->left;TreeNode* right = root->right;int leftDepth = 0, rightDepth = 0;while(left) {left = left->left;leftDepth++;}while(right){right = right->right;rightDepth++;}if(leftDepth==rightDepth){  // 判断当前子树是不是满二叉树,即左右深度相同// 如果是满二叉树,则返回节点个数return (2 << leftDepth) - 1;}// 单层递归逻辑return countNodes(root->left) + countNodes(root->right) + 1;}
};
http://www.lryc.cn/news/342170.html

相关文章:

  • 每日新闻掌握【2024年5月6日 星期一】
  • 谈谈Tcpserver开启多线程并发处理遇到的问题!
  • 618好物节不知道买什么?快收下这份好物推荐指南!
  • Django高级表单处理与验证实战
  • 类和对象-Python-第一部分
  • Pytorch实现图片异常检测
  • 【NOI-题解】1586. 扫地机器人1430 - 迷宫出口1434. 数池塘(四方向)1435. 数池塘(八方向)
  • 探究MySQL行格式:解析DYNAMIC与COMPACT的异同
  • MATLAB绘制蒸汽压力和温度曲线
  • repo跟git的关系
  • Mysql 8.0 -- 最新版本安装(保姆级教程)
  • sql优化思路
  • gin学习1-7
  • likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?
  • (done) LSTM 详解 (包括它为什么能缓解梯度消失)
  • springboot使用研究
  • 老旧房屋用电线路故障引起的电气火灾预防对策​
  • OpenAI发布GPT-4.0使用指南
  • 【WEEK11】学习目标及总结【Spring Boot】【中文版】
  • Unity 性能优化之图片优化(八)
  • C++类细节,面试题02
  • Stylus的引入
  • 前端框架-echarts
  • 【StarRocks系列】 Trino 方言支持
  • 【2024最新华为OD-C卷试题汇总】URL拼接 (100分) - 三语言AC题解(Python/Java/Cpp)
  • 【ARM 嵌入式 C 字符串系列 23.7 -- C 实现函数 isdigit 和 isxdigit】
  • 三分钟了解计算机网络核心概念-数据链路层和物理层
  • 数据结构===堆
  • AAA、RADIUS、TACACS、Diameter协议介绍
  • Nacos高频面试题及参考答案(2万字长文)