题目

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

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

说明:叶子节点是指没有子节点的节点。

示例 1:

示例
示例

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

示例 2:

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

提示:

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

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/

方法

BFS( Breath First Search ):广度优先算法

什么是广度优先算法?

BFS是一种暴力搜索算法,目的是系统地展开并检查中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能地址,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法

从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出队列中。一般的实现里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)

实现方法

  1. 首先将根节点放入队列中。
  2. 从队列中取出第一个节点,并检验它是否为目标。

    • 如果找到目标,则结束搜索并回传结果。
    • 否则将它所有尚未检验过的直接子节点加入队列中。
  3. 若队列为空,表示整张图都检查过了——亦即图中没有欲搜索的目标。结束搜索并回传“找不到目标”。
  4. 重复步骤2。

来自维基百科。

大意就是利用队列先进先出的原理,需要一个队列进行遍历,存储的是同层级的数据,例如root节点加入队列,取出root节点之后需要把下一层级或者说下一步需要执行的节点加入队列,假如再加一个参数记录树的深度,就会发现好像还需要一个循环来遍历同层级的节点,以保证树深度的准确性。

解题思路

一层层遍历(树层级),同层级节点遍历,当发现了叶子节点,即没有左右子节点,就是我们结束遍历的地方,所以在遍历树层级还需要一个参数记录当前的层级。

完整代码

package org.chenly.study;

import java.util.LinkedList;
import java.util.Queue;

/**
 * https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
 *
 * @author chenly
 * @create 2020-11-14 11:41
 */
public class MinDepth111 {

   static 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;
      }
   }

   public static int minDepth(TreeNode root) {
      if (root == null) {
         return 0;
      }
      Queue<TreeNode> queue = new LinkedList<>();
      //第一个节点入队
      queue.add(root);
      int deep = 1;
      while (!queue.isEmpty()) {
         int size = queue.size();
         for (int i = 0; i < size; i++) {
            TreeNode treeNode = queue.poll();
            TreeNode left = treeNode.left;
            TreeNode right = treeNode.right;
            //判断是否叶子节点
            if (left == null && right == null) {
               return deep;
            }
            if (left != null) {
               queue.add(left);
            }
            if (right != null) {
               queue.add(right);
            }
         }
         //要在树深度层级进行层级+1
         deep++;
      }
      return deep;

   }

   public static void main(String[] args) {
      //TreeNode treeNode = new TreeNode(2, null, new TreeNode(3, null, new TreeNode(4, null, new TreeNode(5, null, new TreeNode(6)))));
      //[3,9,20,null,null,15,7]
      TreeNode treeNode = new TreeNode(3, new TreeNode(9), new TreeNode(20, new TreeNode(15), new TreeNode(7)));

      System.out.println(minDepth(treeNode));
   }

}