二叉树的最小深度-递归算法和非递归算法

递归算法

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

在使用递归算法求得二叉树的最小深度时与求最大深度的思路类似,代码如下

public int minDepth(TreeNode root) {
    if (root == null) return 0;
    return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
}

那么代码是不是就这样呢?这样写看起来是对的,但其实这种解法忽略了一种情况,就是说,如果一个节点只有左子树,没有右子树,那么从这个节点开始的最小深度究竟是1还是左子树的深度呢,从上面这种算法来看,求出来等于1
在这里插入图片描述

类似于这种二叉树,它的最小深度是3,而不是1,那么该如何改进呢?

public int minDepth(TreeNode root) {
    if (root == null) return 0;
    /*
    当一个节点的左节点为null或者右节点为null时
    返回的并不是较小值,而是较大值,因为当前节点不是叶子节点,返回的是不为null节点的最小深度
    */
    if (root.left == null || root.right == null) {
        return Math.max(minDepth(root.left), minDepth(root.right)) + 1;
    }
    // 当节点的左右节点都存在时,则返回左右子树深度的较小值+1
    return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
}

非递归算法(BFS)

同样是使用使用广度遍历,依次将所有节点一次加入到队列中,每遍历完一层深度++

public int minDepth(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<>();
    int count = 0;
    if (root == null) {
        return 0;
    }
    // 将根节点和一个标志null加入到队列中
    queue.offer(root);
    queue.offer(null);
    while (!queue.isEmpty()) {
        root = queue.poll();
        // 如果是null则表示一层已经遍历完,深度++
        if (root == null) {
            // 如果队列已经是空了,则不需要加入null
            if (!queue.isEmpty()) {
                queue.offer(null);
            }
            count++;
        } else {
            if (root.left != null) {
                queue.offer(root.left);
            }
            if (root.right != null) {
                queue.offer(root.right);
            }
            // 如果当前节点的左右节点都不存在则说明这个节点时距离根节点最近的叶子结点,即可退出循环
            if (root.left == null && root.right == null) {
                count++;
                break;
            }
        }
    }
    return count;
}

为什么队列操作不使用add和remove,而使用offer和poll呢?

  1. add和offer都是添加一个元素,不同之处在于,如果超出队列的界限时,add会抛出一个异常,而offer会返回false
  2. remove和poll都是从链表首抽取一个元素,区别在如果链表为空时remove会抛出一个异常,而poll则是返回一个null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值