LeetCode 222. 完全二叉树的节点个数
1.LeetCode 203. 移除链表元素2.LeetCode 206. 反转链表3.LeetCode 24. 两两交换链表中的节点4.LeetCode 19. 删除链表的倒数第 N 个结点5.LeetCode 160. 相交链表6.LeetCode 142. 环形链表 II7.LeetCode 242. 有效的字母异位词8.LeetCode 349. 两个数组的交集9.LeetCode 202. 快乐数10.LeetCode 704. 二分查找 题解11.LeetCode 27. 移除元素 题解12.LeetCode 977. 有序数组的平方13.LeetCode 209. 长度最小的子数组14.LeetCode 59. 螺旋矩阵 II15.LeetCode 1. 两数之和16.LeetCode 454. 四数相加 II17.LeetCode 383. 赎金信18.LeetCode 15. 三数之和19.LeetCode 18. 四数之和20.LeetCode 76. 最小覆盖子串21.LeetCode 344. 反转字符串22.LeetCode 541. 反转字符串 II23.LeetCode 剑指 Offer 05. 替换空格24.LeetCode 151. 反转字符串中的单词25.LeetCode 剑指 Offer 58 - II. 左旋转字符串26.LeetCode 459. 重复的子字符串27.kmp算法详解28.LeetCode 20. 有效的括号29.LeetCode 1047. 删除字符串中的所有相邻重复项30.LeetCode 150. 逆波兰表达式求值31.LeetCode 239. 滑动窗口最大值32.LeetCode 347. 前 K 个高频元素33.LeetCode 94. 二叉树的中序遍历34.LeetCode 144. 二叉树的前序遍历35.LeetCode 145. 二叉树的后序遍历36.LeetCode 102. 二叉树的层序遍历37.LeetCode 226. 翻转二叉树38.LeetCode 101. 对称二叉树39.LeetCode 104. 二叉树的最大深度40.LeetCode 559. N 叉树的最大深度41.LeetCode 111. 二叉树的最小深度
42.LeetCode 222. 完全二叉树的节点个数
43.LeetCode 110. 平衡二叉树44.LeetCode 257. 二叉树的所有路径45.LeetCode 404. 左叶子之和46.LeetCode 513. 找树左下角的值47.LeetCode 112. 路径总和48.LeetCode 113. 路径总和 II49.LeetCode 106. 从中序与后序遍历序列构造二叉树50.LeetCode 105. 从前序与中序遍历序列构造二叉树51.LeetCode 654. 最大二叉树52.LeetCode 617. 合并二叉树53.LeetCode 700. 二叉搜索树中的搜索54.LeetCode 98. 验证二叉搜索树55.LeetCode 530. 二叉搜索树的最小绝对差56.LeetCode 501. 二叉搜索树中的众数57.LeetCode 236. 二叉树的最近公共祖先58.LeetCode 235. 二叉搜索树的最近公共祖先59.LeetCode 701. 二叉搜索树中的插入操作60.LeetCode 450. 删除二叉搜索树中的节点61.LeetCode 669. 修剪二叉搜索树62.LeetCode 108. 将有序数组转换为二叉搜索树63.LeetCode 538. 把二叉搜索树转换为累加树64.LeetCode 131. 分割回文串题目链接:LeetCode 222. 完全二叉树的节点个数
题意:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
解题思路:
1.按照普通的二叉树处理
递归法:
//本题直接就是求有多少个节点,无脑存进结果变量就行了。
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
res := 1
if root.Right != nil {
res += countNodes(root.Right)
}
if root.Left != nil {
res += countNodes(root.Left)
}
return res
}
迭代法:
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
var res int
var query []*TreeNode
query = append(query,root)
for len(query) > 0 {
len:=len(query)
res += len
for len > 0 {
len --
node:= query[0]
query = query[1:]
if node.Left != nil {
query = append(query,node.Left)
}
if node.Right != nil {
query = append(query,node.Right)
}
}
}
return res
}
2.利用完全二叉树的性质求解
递归法
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
leftH, rightH := 0, 0
leftNode := root.Left
rightNode := root.Right
for leftNode != nil {
leftNode = leftNode.Left
leftH++
}
for rightNode != nil {
rightNode = rightNode.Right
rightH++
}
if leftH == rightH { //左右子树的遍历深度相等,说明是满二叉树,
return (2 << leftH) - 1 //注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量
}
return countNodes(root.Left) + countNodes(root.Right) + 1
}
迭代法:
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
q := list.New()
q.PushBack(root)
res := 0
for q.Len() > 0 {
n := q.Len()
for i := 0; i < n; i++ {
node := q.Remove(q.Front()).(*TreeNode)
if node.Left != nil {
q.PushBack(node.Left)
}
if node.Right != nil {
q.PushBack(node.Right)
}
res++
}
}
return res
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了