0
点赞
收藏
分享

微信扫一扫

[二叉数]二叉树的最小深度(递归和迭代做法)

一、题目描述

原文链接:111. 二叉树的最小深度


具体描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

示例 1:
在这里插入图片描述



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

示例 1:

示例 2:

提示:

  • 树中节点数的范围在 [0, 10^5] 内
  • -1000 <= Node.val <= 1000

二、思路分析

其实之前我们做过一次这道题,但是用的层次遍历,层次遍历那是真香呀,可以一打十题!可以看看这篇文章!
我们还了解过迭代遍历和递归遍历!那我们在聊一聊这两个!
首先递归遍历,老样子,三部曲:

  • 参数和返回值类型,返回值不用犹豫就是int,参数的话需要传递二叉树,而且还需要传递深度,所以两个参数 public int getMinDepth(TreeNode root, int deepth)
  • 中止条件就是如果树为空则返回当前深度!
  • 单层遍历(我们用后序遍历举例)就是第一遍历左子树,第二遍历右子树,第三就是如果左子树为空,右子树不为空则返回左子树的深度(毕竟最小深度嘛),如果左子树不为空,右子树为空,则然会右子树高度,否则返回左右子树的最小值!

迭代遍历的话,需要注意的点就是左右子树都为空才返回深度!


三、AC代码

递归做法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        return getMinDepth(root, 0);
    }
    public int getMinDepth(TreeNode root, int deepth){
        if (root == null) return deepth;
        int leftDeepth = getMinDepth(root.left, deepth + 1);
        int rightDeepth = getMinDepth(root.right, deepth + 1);
        
        if (root.left == null && root.right != null){
            return rightDeepth;
        }
        if (root.left != null && root.right == null){
            return leftDeepth;
        }

        return leftDeepth > rightDeepth ? rightDeepth : leftDeepth ;
    }
}

迭代做法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        if (root != null) deque.offer(root);
        int depth = 0;
        while (!deque.isEmpty()){
            int len = deque.size();
            depth++;
            while (len > 0){
                TreeNode tmpNode = deque.poll();
                if (tmpNode.left != null) deque.offer(tmpNode.left);
                if (tmpNode.right != null) deque.offer(tmpNode.right);
                if (tmpNode.left == null && tmpNode.right == null) return depth;
                len--;
            }
        }
        return depth;
    }
}

四、总结

  • 二叉树的迭代和递归遍历复习!


举报

相关推荐

0 条评论