2021-03-21:给定一棵二叉树的头节点head,求以head为头的树中,最小深度是多少?

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-03-21:给定一棵二叉树的头节点head,求以head为头的树中,最小深度是多少?相关的知识,希望对你有一定的参考价值。

2021-03-21:给定一棵二叉树的头节点head,求以head为头的树中,最小深度是多少?


福大大 答案2021-03-21:


1.递归。

2.莫里斯遍历。


代码用golang编写,代码如下:

package main
import "fmt"
func main() { head := &TreeNode{} head.Left = &TreeNode{} head.Right = &TreeNode{} head.Right.Right = &TreeNode{}
ret := minHeight1(head) fmt.Println("1.递归:", ret)
ret = minHeight2(head) fmt.Println("2.莫里斯遍历:", ret)}
//Definition for a binary tree node.type TreeNode struct { Val int Left *TreeNode Right *TreeNode}
const INT_MAX = int(^uint(0) >> 1)
func minHeight1(head *TreeNode) int { if head == nil { return 0 } leftVal := minHeight1(head.Left) rightVal := minHeight1(head.Right) return 1 + getMin(leftVal, rightVal)}
// 根据morris遍历改写func minHeight2(head *TreeNode) int { if head == nil { return 0 } cur := head var mostRight *TreeNode curLevel := 0 minHeight := INT_MAX for cur != nil { mostRight = cur.Left if mostRight != nil { rightBoardSize := 1 for mostRight.Right != nil && mostRight.Right != cur { rightBoardSize++ mostRight = mostRight.Right } if mostRight.Right == nil { // 第一次到达 curLevel++ mostRight.Right = cur cur = cur.Left continue } else { // 第二次到达 if mostRight.Left == nil { minHeight = getMin(minHeight, curLevel) } curLevel -= rightBoardSize mostRight.Right = nil } } else { // 只有一次到达 curLevel++ } cur = cur.Right } finalRight := 1 cur = head for cur.Right != nil { finalRight++ cur = cur.Right } if cur.Left == nil && cur.Right == nil { minHeight = getMin(minHeight, finalRight) } return minHeight}func getMin(a int, b int) int { if a < b { return a } else { return b }}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class30/Code05_MinHeight.java#L35)

[评论](https://user.qzone.qq.com/3182319461/blog/1616301270)


以上是关于2021-03-21:给定一棵二叉树的头节点head,求以head为头的树中,最小深度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树每个节点有一个权值,给定一棵二叉树,求权值和最大的值

判断二叉树是否平衡二叉树

求二叉树中最大的二叉搜索子树的头节点

算法总结之 打印二叉树的边界节点

"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树

3.3 如何较为直观地打印二叉树