求二叉树的最小深度

LeetCode 111

题目描述

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

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

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

示例:

给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最小深度 2.

题目分析

  • 宽度优先遍历(BFS)借助队列,最先到达的叶子节点一定是最小深度上的叶子节点。
  • 深度优先遍历(DFS)需要遍历根节点到所有叶子节点之间的路径,然后从中选取最小深度。

代码

BFS (c++)

int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        queue<pair<TreeNode*, int>>nodes;
        nodes.emplace(root,1);
        
        while(!nodes.empty()){
            root = nodes.front().first;
            int depth = nodes.front().second;
            nodes.pop();
            if (!root->left && !root->right){
                return depth;
            }
            if(root->left){
                nodes.emplace(root->left, depth+1);
            }
            if(root->right){
                nodes.emplace(root->right, depth+1);
            }
        }
        return 0;
    }

时间复杂度:O(N) N是节点的数量。
空间复杂度:队列的容量最大为树的节点数量,即O(N)。

DFS (python)

class Solution:
    import copy
    def minDepth(self, root: TreeNode) -> int:
        res= []
        if not root:
            return 0;
        def dfs(root, depth):
            if not root.left and not root.right:
                res.append(copy.deepcopy(depth)+1);
                return
            if root.left:
                dfs(root.left, depth+1)
            if root.right:
                dfs(root.right, depth+1)
        dfs(root, 0)
        return min(res)

时间复杂度:O(N):N是节点的个数。
空间复杂度:O(H):H是树的高度。最坏情况是二叉树为单链表状时,空间复杂度为O(N),平均情况为树的高度O(H) = O(logN)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。