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

面试经典 222. 完全二叉树的节点个数

  • 二叉树我最近刷的特别多,差不多快刷完了,但是有一种题型差点给我忽略了,那就是完全二叉树,这也是一个很重要的题型,今天刚好有一道题目可以来复习一下完全二叉树的特性

  • 题目链接如下:https://leetcode.cn/problems/count-complete-tree-nodes/?envType=study-plan-v2&envId=top-interview-150
    在这里插入图片描述

  • 做这道题首先有一点要知道的,就是完全二叉树是怎么样子的,下面说一下完全二叉树的概念

  • 完全二叉树:只有最底层的节点未被填满,且最底层节点尽量靠左填充
    在这里插入图片描述

  • ok 现在已经了解了基础概念了,我们再来看这道题目

  • 这道题目的目的是让我们遍历这棵树,并算有几个节点

  • 说实话,这道题很简单,用暴力的做法,就是遍历一整棵树,代码如下:

  • 递归法:

//方法一:递归
func Solution222(root *TreeNode) int {if root == nil {return 0}left := Solution222(root.Left)right := Solution222(root.Right)return left + right + 1
}
  • 迭代法:
//方法二:迭代
func Solution222v2(root *TreeNode) int {if root == nil{return 0}queue := []*TreeNode{root}count := 0for len(queue) > 0{node := queue[0]queue = queue[1:]count++if node.Left != nil{queue = append(queue, node.Left)}if node.Right != nil{queue = append(queue, node.Right)}}return count
}
  • 这两个方法是遍历树的最基本的方法之一

  • 但是 这不是这道题的本意,这道题目是想要我们理由完全二叉树这个特性解题

  • 那我们需要好好思考一下,完全二叉树有什么特点

    • 除了最后的叶子节点,其他层级节点都是满的

    • 当 左子树的深度 和 右子树的深度 一致的时候,说明 左子树是满的二叉树 可以通过 2的h次方求的左子树的节点个数在这里插入图片描述

    • 当 右子树的深度 不如 左子树的深度 的时候,说明 左子树不是一个满的二叉树,但是右子树单独看是一个满的二叉树,所以可以通过 2的h次方求右子树的节点个数在这里插入图片描述

  • ok,知道这些特点,我们是不是可以利用一个逻辑来减少遍历

    • 当 左子树深度 等于 右子树的时候,就可以通过深度来计算左子树的节点,然后只遍历右子树
    • 当 左子树深度 等于 右子树的时候,就可以通过深度来计算右子树的节点,然后只遍历左子树
  • 这样我们本来需要遍历全部二叉树节点的,现在只需要遍历一半,思路瞬间打开,代码如下:

//方法三:二分查找
func Solution222v3(root *TreeNode) int {if root == nil{return 0}//检索左子树深度left := root.Leftldepth := 0for left != nil{left = left.Leftldepth++}//检索右子树深度right := root.Rightrdepth := 0for right != nil{right = right.Leftrdepth++}//左右子树深度判断if ldepth == rdepth{return (1<<ldepth) + Solution222v3(root.Right)}else{return (1<<rdepth) + Solution222v3(root.Left)}
}


ok,这里这道题目就结束了,感谢大家观看

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 身份证OCR识别接口如何对接?(二)
  • 《Linux运维总结:基于Ubuntu 22.04+x86_64架构CPU部署etcd 3.5.15二进制分布式集群》
  • 样式与特效(2)——新闻列表
  • java之方法引用 —— ::
  • c语言第七天笔记
  • IPython的魔法:深入探索%%pastebin命令的奥秘
  • Python切片的用法
  • STM32DMA数据传输
  • Golang之OpenGL(一)
  • 平舌、翘舌音学习: z、c、s--zh、ch、sh
  • 使用 MinIO、Langchain 和 Ray Data 构建分布式嵌入式子系统
  • electron-builder打包vue2项目问题合集
  • Java | Leetcode Java题解之第316题去除重复字母
  • MongoDB简介及其在Java中的应用
  • 大语言模型(LLM)快速理解
  • 30天自制操作系统-2
  • CentOS7 安装JDK
  • flutter的key在widget list的作用以及必要性
  • JavaScript的使用你知道几种?(上)
  • JavaScript设计模式与开发实践系列之策略模式
  • java中的hashCode
  • js继承的实现方法
  • Object.assign方法不能实现深复制
  • PHP的类修饰符与访问修饰符
  • python 装饰器(一)
  • Redis 中的布隆过滤器
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • TCP拥塞控制
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue小说阅读器(仿追书神器)
  • Web标准制定过程
  • windows下使用nginx调试简介
  • 后端_MYSQL
  • 深度解析利用ES6进行Promise封装总结
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 跳前端坑前,先看看这个!!
  • 系统认识JavaScript正则表达式
  • 一份游戏开发学习路线
  • ​​​【收录 Hello 算法】9.4 小结
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​力扣解法汇总946-验证栈序列
  • #pragma 指令
  • #WEB前端(HTML属性)
  • (1)(1.11) SiK Radio v2(一)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java数据结构)ArrayList
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (过滤器)Filter和(监听器)listener
  • (三)mysql_MYSQL(三)
  • (四)linux文件内容查看
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Google的Objective-C编码规范