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代码
评论

posted @   福大大架构师每日一题  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示