刷刷刷 Day 16 | 222. 完全二叉树的节点个数
222. 完全二叉树的节点个数
LeetCode题目要求
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h) 个节点。
示例

输入:root = [1,2,3,4,5,6] 输出:6
解题思路
- 一种方法是直接计算节点个数,不管它是什么树
- 根据完全二叉树的特点来计算节点个数,第一种情况是满二叉树,那么只要知道深度,就可以根据公式 2^depth - 1 计算节点个数了。 第二种情况不是满二叉树,但子树一定存在满二叉树,那么可以先找到满二叉树,计算深度,然后计算其他节点
上代码,通用节点计算
class Solution { public int countNodes(TreeNode root) { if (root == null) { return 0; } return countNodes(root.left) + countNodes(root.right) + 1; } }
上代码,完全二叉树节点计算
class Solution { public int countNodes(TreeNode root) { if (root == null) { return 0; } TreeNode leftNode = root.left; TreeNode rightNode = root.right; // 定义左右子树深度 int leftDepth = 0, rightDepth = 0; // 计算左子树深度 while (leftNode != null) { leftNode = leftNode.left; leftDepth++; } // 计算右子树深度 while (rightNode != null) { rightNode = rightNode.right; rightDepth++; } // 判断所有子树深度是否一致,如果一致就根据公式计算节点数量 if (leftDepth == rightDepth) { return (2 << leftDepth) - 1; } // 非满二叉树,计算其他节点数量 return countNodes(root.left) + countNodes(root.right) + 1; } }
重难点
本题使用通用解法并使用后序遍历写法很简单。但是根据题目,要分析的完全二叉树的特点,并利用它的特性计算节点数量,可以有效减少计算时间复杂度
附:学习资料链接
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了