ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉树的最小深度

2022-01-15 14:04:25  阅读:96  来源: 互联网

标签:node min 最小 depth 二叉树 深度 null root


二叉树的最小深度

题目:二叉树的最小深度

《程序员代码面试指南》第33题 P100 难度:原问题 士★☆☆☆ 进阶问题 将★★★★

本题书上有普通解法和进阶解法。进阶解法用到了遍历二叉树的神级方法——Morris遍历,暂时不看,有空回来补。

下面介绍普通解法。很简单,就是在遍历的过程中去发现所有的叶子结点,并且能够知道该叶子结点的高度。最后找到所有叶子结点高度中的最小值

牛客上没有这题,力扣上有深度优先搜索广度优先搜索两种方法。

DFS(时间复杂度O(N),空间复杂度O(H)):

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }

        if (root.left == null && root.right == null) {
            return 1;
        }

        int min_depth = Integer.MAX_VALUE;
        if (root.left != null) {
            min_depth = Math.min(minDepth(root.left), min_depth);
        }
        if (root.right != null) {
            min_depth = Math.min(minDepth(root.right), min_depth);
        }

        return min_depth + 1;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/er-cha-shu-de-zui-xiao-shen-du-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不难发现,递归直到找到叶子结点后,返回深度1,然后从下往上逐层深度加1,并且每次左子树和右子树取最小深度。到第一层根节点处,同样,找出左子树和右子树的最小深度后,再返回深度加1,即加上根节点的深度,就是整个二叉树的最小深度

BFS(时间复杂度O(N),空间复杂度O(N)):

class Solution {
    class QueueNode {
        TreeNode node;
        int depth;

        public QueueNode(TreeNode node, int depth) {
            this.node = node;
            this.depth = depth;
        }
    }

    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }

        Queue<QueueNode> queue = new LinkedList<QueueNode>();
        queue.offer(new QueueNode(root, 1));
        while (!queue.isEmpty()) {
            QueueNode nodeDepth = queue.poll();
            TreeNode node = nodeDepth.node;
            int depth = nodeDepth.depth;
            if (node.left == null && node.right == null) {
                return depth;
            }
            if (node.left != null) {
                queue.offer(new QueueNode(node.left, depth + 1));
            }
            if (node.right != null) {
                queue.offer(new QueueNode(node.right, depth + 1));
            }
        }

        return 0;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/er-cha-shu-de-zui-xiao-shen-du-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

可以看出,使用了队列的数据结构,每次从队头取出一个节点的同时,将它的左子树和右子树(如果有的话)放入队尾,形成了层序遍历的过程。

对于广度优先搜索进行特别说明:

找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小

这是因为广度优先搜索相当于层序遍历二叉树,如果一个节点是叶子结点,说明当前层和之前的所有层都没有出现过叶子结点(不然就已经返回了),所以第一个搜索到的叶子结点深度一定是最小的

标签:node,min,最小,depth,二叉树,深度,null,root
来源: https://www.cnblogs.com/CWZhou/p/15806840.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有