13-二叉树最小深度-深度优先(DFS)
一、定义
什么是二叉树的最小深度?
二叉树的最小深度是指从根节点到最近的叶子节点的最短路径上的节点数。叶子节点是指没有子节点的节点。
举个例子:
1 / \ 2 3 / 4
这棵树的最小深度是 2,因为从根节点 1
到叶子节点 3
的路径最短,只需要经过 1
和 3
两个节点。
深度优先搜索(DFS)的思路
深度优先搜索是一种遍历树的方法,它的特点是一条路走到底,直到遇到叶子节点或者无法继续前进时,再回溯到上一个节点,尝试其他路径。
用 DFS 求最小深度的步骤如下:
-
从根节点开始,递归地遍历它的左子树和右子树。
-
如果当前节点是叶子节点(即没有左子树和右子树),返回深度 1。
-
如果当前节点只有左子树或右子树,继续递归遍历存在的子树。
-
如果当前节点有左右子树,分别递归计算左右子树的最小深度,然后取较小的那个,再加上当前节点的深度 1。
-
最终返回最小深度。
举个例子
假设我们有一棵树:
1 / \ 2 3 / \ 4 5
用 DFS 计算最小深度的过程如下:
-
从根节点
1
开始,递归遍历左子树2
。-
节点
2
是叶子节点,返回深度 1。
-
-
递归遍历右子树
3
。-
节点
3
有左右子树,递归遍历左子树4
。-
节点
4
是叶子节点,返回深度 1。
-
-
递归遍历右子树
5
。-
节点
5
是叶子节点,返回深度 1。
-
-
节点
3
的最小深度是min(1, 1) + 1 = 2
。
-
-
根节点
1
的最小深度是min(1, 2) + 1 = 2
。
所以这棵树的最小深度是 2。
二,举例
计算该二叉树的最小深度:
1
/ \
2 3
/ \ \
4 5 6
\
7
import javax.swing.tree.TreeNode;
public class demo01 {
public static void main(String[] args) {
TreeNode node7 =new TreeNode(7,null,null);
TreeNode node6 =new TreeNode(6,node7,null);
TreeNode node5 =new TreeNode(5,null,null);
TreeNode node4 =new TreeNode(4,null,null);
TreeNode node3 =new TreeNode(3,node6,null);
TreeNode node2 =new TreeNode(2,node4,node5);
TreeNode node1 =new TreeNode(1,node2,node3);
System.out.println(minDepth(node1));
}
public static int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
return 1;
}
int min=Integer.MAX_VALUE;
if(root.left != null) { //左边节点不为空
min=Math.min(minDepth(root.left),min); //算出左边节点
}
if(root.right != null) { //左边节点不为空
min=Math.min(minDepth(root.right),min); //算出左边节点
}
return min+1;
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val,TreeNode left,TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
}