二叉树part3 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数


104.二叉树的最大深度

104.二叉树的最大深度

思路

三行手撕。
递归。
递归三要素:
确定递归函数的参数和返回值:参数:根节点,返回值以该根节点为树的深度
确定终止条件: 根节点为nIl,直接返回0,深度为0
确定单层递归的逻辑: 将左右节点的最大深度相比取最大值然后加1,也就是当前节点的最大深度。
时间复杂度On
空间复杂度Oh

代码

func maxDepth(root *TreeNode) int {
    if root==nil{
        return 0
    }
    return 1+max(maxDepth(root.Left),maxDepth(root.Right))
}

func max(i,j int) int{
    if i<j{
        return j
    }else{
        return i
    }
}

559.n叉树的最大深度

559.n叉树的最大深度

思路

与上题一样

代码

func maxDepth(root *Node) int {
    if root==nil{
        return 0
    }
    res:=0
    for _,v:=range root.Children{
        res=max(res,maxDepth(v))
    }
    return 1+res
    
}

func max(i,j int)int{
    if i<j{
        return j
    }else{
        return i
    }
}

111.二叉树的最小深度

111.二叉树的最小深度

思路

递归。
时间复杂度On
空间复杂度Oh

代码

func minDepth(root *TreeNode) int {
    if root==nil{
        return 0
    }
    res:=math.MaxInt32
    if root.Left!=nil||root.Right!=nil{
        if root.Left!=nil{
            res=min(res,minDepth(root.Left))
        }
        if root.Right!=nil{
            res=min(res,minDepth(root.Right))
        }
    }else{
        res=0
    }
    return 1+res
}

func min(i,j int)int{
    if i<j{
        return i
    }else{
        return j
    }
}

困难

注意只要求到叶子节点,所以递归的时候判断如果子树为nil,就不进行递归。在判断外部记录结果(足够大的值),进到递归后更新这个值。最后如果都不进行递归说明没有左右子树,这时候才可以判断其子树的最小深度为0。


222.完全二叉树的节点个数

222.完全二叉树的节点个数

思路

因为树已经是完全二叉树了
递归根据这个条件,先判断左右子节点是否是完全二叉树,是的话用公式计算2^h-1
时间复杂度Ologn*Ologn

代码

func countNodes(root *TreeNode) int {
    if root==nil{
        return 0
    }
    lh,rh:=0,0
    cl,cr:=root.Left,root.Right
    for cl!=nil{
        cl=cl.Left
        lh++
    }
    for cr!=nil{
        cr=cr.Right
        rh++
    }
    if lh==rh{
        return (2<<lh)-1
    }
    return 1+countNodes(root.Left)+countNodes(root.Right)
}

困难

根据完全二叉树的条件写递归终止的逻辑。


今日收获

对二叉树问题结合递归解法有了更深的了解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值