111. 二叉树的最小深度

题目

  • 给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

python

完美踩坑

  • 之前好几个题做过求树的高度,以为只需要把返回左右子树较大的一个改为返回左右子树较小的一个就可以了。
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        # 求树的高度
        if root is None:
            return 0
        return min(self.minDepth(root.left),self.minDepth(root.right))+1
  • 当遇到左/右子树空时,上面代码会返回1,把根节点认为是叶子节点,实际上返回的不是1而是不为空的子树那边的叶子节点到根节点的距离。

法一、DFS

  • 单独处理左/右子树为空的情况
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        # 空树
        if root is None:
            return 0
        #只有根节点
        if root.left is None and root.right is None:
            return 1
        #当只有右子树
        if root.left is None and root.right is not None:
            return self.minDepth(root.right)+1
        #当只有左子树
        if root.left is not None and root.right is None:
            return self.minDepth(root.left)+1
        #左右子树都有
        return min(self.minDepth(root.left),self.minDepth(root.right))+1

法二、BFS

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if root is None :
            return 0
        q=[]#用一个列表做队列
        q.append(root)#把根节点放入队列
        depth = 1 #root本身是一层,深度初始化为1
        while q :
            size = len(q)
            #将当前队列中的所有结点向四周扩散
            for _ in range(size):
                cur=q.pop(0)#pop()表示从尾部取,pop(0)才表示从头部取
                if (cur.left is None and cur.right is None):#判断是否到终点
                    return depth
                if cur.left is not None:#将cur的相邻结点加入队列
                    q.append(cur.left)
                if cur.right is not None:
                    q.append(cur.right)
            depth+=1#增加步数
        return depth

javascript

题解:层序遍历

var minDepth = function(root) {
    if(root===null) return 0
    let queue=[root]
    let depth=0
    while(queue.length>0){
        let n = queue.length
        depth++
        for(let i=0;i<n;i++){
            let cur_node=queue.shift()
            //如果左右节点都是null返回层数(返回的是第一个叶子节点)
            if(cur_node.left===null && cur_node.right===null) return depth
            if(cur_node.left) queue.push(cur_node.left)
            if(cur_node.right) queue.push(cur_node.right)
        }
    }
    return depth
};
posted @   Frommoon  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示