zoukankan      html  css  js  c++  java
  • 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代码
    评论

  • 相关阅读:
    java设计模式之单例模式总结
    分页功能实现
    java设计模式之代理模式模式总结
    java设计模式之策略模式总结
    快速排序解决相关问题
    单例模式之恶汉模式(详解)
    java多线程之内存的可见性介绍(备用1)
    Robotframework(4):创建变量的类型和使用
    Robotframework(3):使用pycharm编写和运行RF脚本
    Robotframework(2):创建RF第一条可执行的用例
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14564202.html
Copyright © 2011-2022 走看看