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

举报
福大大架构师每日一题 发表于 2021/03/21 22:30:02 2021/03/21
【摘要】 2021-03-21:给定一棵二叉树的头节点head,求以head为头的树中,最小深度是多少?福大大 答案2021-03-21:1.递归。2.莫里斯遍历。代码用golang编写,代码如下:package mainimport "fmt"func main() { head := &TreeNode{} head.Left = &TreeNode{} head.Right =...

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。