二叉树 - 最大深度和最小深度

LeetCode 二叉树的最大深度

LeetCode 二叉树的最小深度

我们知道完全二叉树,是可以根据节点数量进行计算出深度的, 但是非完成二叉树呢 , 他就不满足了,

树结构体

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

1. 二叉树的最大深度

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

/**
 * 最大深度
 *
 * @param root 根节点
 * @return 最大深度
 */
public static int maxDepth(TreeNode root) {
    // 为空直接返回0
    if (root == null) return 0;
    
    // 递归
    int left = maxDepth(root.left);
    int right = maxDepth(root.right);
    
    // (left <= right) ? left : right 这个就是取最大值Math.man()
    return ((left >= right) ? left : right) + 1;
}

首先我画一张图 大家理解一下 ,

所以他的意思就是 当我找到一个叶子节点 , 我就+1 (在那个分支上) , 然后返回的时候 , 大的+1 ; 所以我们想想我们计算树的深度是不是这么计算了 从 1->3->4 , 从4开始返回+1 (加一是记录深度), 每次遇到根节点都要比较一下, 取最大值然后再加一

2. 二叉树的最大深度

​ 最小深度是从根节点到最近叶子节点(空节点当然不算了)的最短路径上的节点数量说明: 叶子节点是指没有子节点的节点。

正常人的思路都是下面这个, 前提是做了前面那道题 , 直接答案反过来么 , 但是我们先往下看

/**
 * 最小深度
 *
 * @param root
 * @return
 */
public static int minDepth(TreeNode root) {
    if (root == null) return 0;
    int left = minDepth(root.left);
    int right = minDepth(root.right);
    // (left <= right) ? left : right 这个就是取最小值Math.min()
    return ((left <= right) ? left : right) + 1;
}

下面是程序的基本执行流程

看似这个问题和上面那个问题相反 ,但是执行起来还是不好想的, 比如取最短 ,是不是我们拿这个题为例子, 每次遇到根节点都进行比较一下取最小,然后+1 , 其实目的就是为了找到最短的分支 .

有一种情况比较特殊 : 就是他这里说是 根节点到最近叶子节点的最短路径 , 所以比如我们上面画的是错的, 因为 null不算是叶子节点, 他为空 ,所以上面那个题叶子节点是4 , 此时树的最小深度是3 ,所以不单单是我们上述题反过来那么简单 ,上述例子出来是1 .

所以正确的代码是 :

/**
 * 最小深度 , 从根节点到最近叶子节点的最短路径上的节点数量。
 *
 * @param root 根节点
 * @return 到最近叶子节点的最短距离
 */
public static int minDepth(TreeNode root) {
    if (root == null) return 0;

    int left = minDepth(root.left);
    int right = minDepth(root.right);
	// 特殊地方
    if (left == 0 || right == 0) return left + right + 1;

    return ((left <= right) ? left : right) + 1;
}

执行流程就是下面这个 , 因为空的叶子节点不算, 所以我们遇到空叶子节点性需要(不知道是左是右)排除,就是left + right + 1 ,可能left=0或者right=0 , 两者都等于或者

有0则加1 , 无0则取最下+1 ;

posted @ 2020-02-02 00:06  Anthony-Dong  阅读(4771)  评论(0编辑  收藏  举报