📜  数据结构|二叉树|问题10(1)

📅  最后修改于: 2023-12-03 14:54:56.595000             🧑  作者: Mango

数据结构 - 二叉树 - 问题10

问题描述

给定一个二叉树,找到其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

注意:叶子节点是指没有子节点的节点。

解题思路
方法一:递归

对于一颗二叉树,它的最小深度等于左右子树的最小深度加1。

因此可以采用递归的方式,依次计算左右子树的最小深度,然后取其中的较小值并加1,即可得到这颗二叉树的最小深度。

需要注意的是,当一个节点的左右子树其中之一为空时,其最小深度应该是非空子树的最小深度加1,而不是0。

方法二:迭代

采用层序遍历的方式可以迭代地计算出每一个节点的深度,并在访问到叶子节点时即可得到最小深度。

具体地,对于每一层的节点,它们的深度都是相同的,因此可以开一个队列,存储该层的节点,并记录下它们的深度。然后依次访问这些节点的左右子树,如果遇到了叶子节点,即可得到最小深度。

代码实现
方法一:递归
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        left_depth = self.minDepth(root.left)
        right_depth = self.minDepth(root.right)
        if not root.left or not root.right:
            return left_depth + right_depth + 1
        return min(left_depth, right_depth) + 1
方法二:迭代
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        queue = [(root, 1)]
        while queue:
            node, depth = queue.pop(0)
            if not node.left and not node.right:
                return depth
            if node.left:
                queue.append((node.left, depth + 1))
            if node.right:
                queue.append((node.right, depth + 1))
总结

对于本题,使用递归和迭代都可以得到正确的结果,时间复杂度均为$O(n)$,空间复杂度取决于二叉树的形态,最坏情况下空间复杂度为$O(n)$。需要注意的是,当一个节点的左右子树其中之一为空时,其最小深度应该是非空子树的最小深度加1,而不是0。