算法篇:树之树的高度
算法:
这一类题目很简单,不过却是树的最基本操作之一,引申为判断树是不是平衡二叉树。
一般做法是,计算二叉树的左右子树的高度+1,然后取它们的最大值或者最小值。
题目1:
https://leetcode-cn.com/problems/balanced-binary-tree/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 一棵平衡二叉树,左右两棵子树的高度差的绝对值不超过1
// 备注:其中任意一个节点如果不满足平衡二叉树时,那么这棵树就不是平衡二叉树了,此时我们可以直接返回flase
func isBalanced(root *TreeNode) bool {
if root == nil { // nil表示的是平衡二叉树
return true
}
// 1.用来计算当前节点的左右子树高度差是1
lH := maxDepth(root.Left)
rH := maxDepth(root.Right)
if abs(lH-rH) > 1{
return false
}
// 2. 进一步判断左子树是不是平衡二叉树
if !isBalanced(root.Left) {
return false
}
// 3. 进一步判断右子树是不是平衡二叉树
return isBalanced(root.Right)
}
// 典型的计算二叉树的高度,当前左右子树的最大高度+1
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
return max(maxDepth(root.Left),maxDepth(root.Right)) + 1
}
func max(a,b int) int {
if a > b {
return a
}
return b
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}
执行结果:
题目2:
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
left := maxDepth(root.Left)
right := maxDepth(root.Right)
if left > right {
return left + 1
}
return right + 1
}
/*
递归算法:
左右子树的高度最大数值+1
*/
执行结果:
题目3:
https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func minDepth(root *TreeNode) int {
if root == nil {
return 0
}
if root.Left ==nil && root.Right == nil {
return 1
}
min := int(^uint(0) >> 1)
if root.Left != nil { // 对于一个孩子的节点,要计算有孩子节点的高度
h := minDepth(root.Left)
if min > h {
min = h
}
}
if root.Right != nil {
h := minDepth(root.Right)
if min > h {
min = h
}
}
return min+1
}
执行结果:
题目4:
https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/
代码实现:
/**
* Definition for a Node.
* type Node struct {
* Val int
* Children []*Node
* }
*/
func maxDepth(root *Node) int {
if root == nil {
return 0
}
var hs []int
for _, n := range root.Children {
h := maxDepth(n)
hs = append(hs,h)
}
max := 0
for _,h:=range hs {
if h > max {
max = h
}
}
return max + 1
}
执行结果:
本文分享自微信公众号 - 灰子学技术(huizixueguoxue)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kustomize ConfigMapGenerate自动生成ConfigMap中的坑
背景问题 最近在使用Kubernetes ConfigMap过程中,由于需要把配置文件复制ConfigMap yaml编排文件中,在copy的过程中,容易出错,于是引入了Kustomize ConfigMapGenerate,通过引用外部配置文件,自动生成配置,但在使用过程中碰到新问题。 ConfigMap名称生成多余 hash。 加载到配置文件中内容格式错乱。 以下分别对这两个个问题进行分析、并给出具体解决方式。 ConfigMapGenerate使用 ConfigMapGenerator是Kustomize ConfigMap自动生成配置插件,使用方式非常简单,如下图所示: 执行kubectl apply -k .执行完成之后查看ConfigMap, ConfigMap倒是生成了,但是后边多了一堆hash字符串如:test-conf-tmc5f824gt。。 why? deployment里面还需要引用这个ConfigMap呢?通过测试发现这个hash后缀,是针对文件内容生成的hash,如果文件内容没有变化,这个hash不会变化,否则重新生成。 原来这个hash类似于ConfigM...
- 下一篇
Flutter Dojo设计之道——利用Github打造完善的开源项目
Flutter Dojo从最开始就准备打造成一个专业的GitHub开源项目。 一个好的GitHub开源项目,不仅仅是一个开发者专业技术的体现,更是一个自我展示的平台,专业的GitHub开源项目,可以吸引更多的开发者参与到项目的协同开发中来,让项目能够健康持续的发展。 下面我将根据Flutter Dojo的开发经历,来讲下如何借助GitHub打造完善的开源项目。 个性化个人主页 GitHub主页给了开发者一个公开的个人展示界面,不用搭建服务器,你就可以免费获得一个属于自己的展示页面,不过这也是GitHub的一个彩蛋功能,首先,你需要创建一个新的repository,并将其命名为你的用户名,如图所示。 这时候你就会发现,同名的repository是一个GitHub彩蛋,你只需要在这个同名的Repo中的README.md中创建自己的主页即可,例如我的主页,如图所示。 这个页面实际上就是通过README.md方式来进行展示的,实际上功能比较有限,但是通过 github-readme-stats 这个项目,也可以给简单的md界面创建一些有意思的东西,例如我的界面中的GitHub Stats和项目...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19