[leetCode]111.二叉树最小深度

在这里插入图片描述

递归

与求二叉树最大深度一样可以使用递归求解,但要注意左子树或右子树为null的情况。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        else if(root.left == null) return minDepth(root.right)+1;
        else if(root.right == null) return minDepth(root.left)+1;
        else{
            int leftDepth = minDepth(root.left);
            int rightDepth = minDepth(root.right);
            return Math.min(leftDepth,rightDepth)+1;
        }
    }
}

DFS迭代

使用一个队列,首先加入一个根节点,在迭代中每次从头部取出一个结点,并在尾部加入子节点,当取出结点遇到叶子结点时跟新最小深度

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 1;
        Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
        queue.add(new Pair(root, 1));//在链表尾部添加结点
        int min = Integer.MAX_VALUE;
        while(!queue.isEmpty()){
            Pair<TreeNode,Integer> current = queue.poll();//取出链表头部元素
            root = current.getKey();
            int currentDepth = current.getValue();
            if(root.left == null && root.right == null)
                min = Math.min(min, currentDepth);
            if(root.left!=null)
                queue.add(new Pair<TreeNode,Integer>(root.left, currentDepth + 1));
            if(root.right!=null)
                queue.add(new Pair<TreeNode,Integer>(root.right, currentDepth + 1));
        } 
        return min;
    }
}

广度优先搜索

深度优先搜索访问了每个节点,广度优先搜索当遇到叶子节点时退出,使用键值对记录每个节点当前的深度

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 1;
        Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
        queue.add(new Pair(root, 1));//在链表尾部添加结点
        int currentDepth = 0;
        while(!queue.isEmpty()){
            Pair<TreeNode,Integer> current = queue.poll();//取出链表头部元素
            root = current.getKey();
            currentDepth = current.getValue();
            if(root.left == null && root.right == null)
                break;
            if(root.left!=null)
                queue.add(new Pair<TreeNode,Integer>(root.left, currentDepth + 1));
            if(root.right!=null)
                queue.add(new Pair<TreeNode,Integer>(root.right, currentDepth + 1));
        } 
        return currentDepth;
    }
}

按层遍历

一层一层的遍历,遇到叶子节点则退出,

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);//在链表尾部添加结点
        int current_depth = 0;
        a:while(!queue.isEmpty()){
            int size = queue.size();//当前层的结点数
            current_depth++;
            for(int i = 0; i < size; i++){ 
                root = queue.poll();//取出每一层的每一个结点          
                if(root.left == null && root.right == null){
                    break a;//遇到叶子结点则退出
                }
                if(root.left!=null){
                    queue.add(root.left);
                }
                if(root.right!=null){
                    queue.add(root.right);
                }
            } 
        } 
        return current_depth;
    }
}
原文地址:https://www.cnblogs.com/PythonFCG/p/13860010.html