二叉树_题目11:111. 二叉树的最小深度

23 阅读2分钟

题目11:111. 二叉树的最小深度

111. 二叉树的最小深度

同类题目

前置知识

题目描述

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

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

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

示例 1:

 输入:root = [3,9,20,null,null,15,7]
 输出:2

示例 2:

 输入:root = [2,null,3,null,4,null,5,null,6]
 输出:5

提示:

  • 树中节点数的范围在 [0, 10^5]
  • -1000 <= Node.val <= 1000

思路分析

本题使用遍历的思想来求解,递归进行遍历,遇到叶子节点时记录最小值。

深度遍历:需要将所有叶子节点都遍历完,才能找到最小值,并不是最优的。

程序代码

方法一:使用一个全局变量记录最小深度

 //https://leetcode.cn/problems/minimum-depth-of-binary-tree/
 //111. 二叉树的最小深度
 ​
 #include<iostream>
 #include<vector>
 #include<queue>
 using namespace std;
 struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 };
 ​
 class Solution {
 private:
     int minDep = 100001;
 public:
     void travel(TreeNode* root,int depth)
     {
         if(root == nullptr)
         {
             minDep = 0;
             return ;
         }
         if(root->left == nullptr && root->right == nullptr)
         {
             minDep = min(minDep,depth);
             return;
         }
         if(root->left)
             travel(root->left,depth + 1);
         if(root->right)
             travel(root->right,depth + 1);
 ​
     }
     int minDepth(TreeNode* root) { 
         travel(root,1);
         return minDep;
     }
 };

复杂度分析

时间复杂度:O(n),其中 n 是二叉树中的节点个数。每个节点都会遍历一次。

空间复杂度:O(n),其中 n 是二叉树中的节点个数。递归栈的开销,极限情况树是链状的高度为O(N)。

程序代码

方法二:广度优先遍历,按照层进行遍历,在找到第一个叶子节点时,就可以返回了。

 class Solution {
 public:
     int travel(TreeNode* root)
     {
         if(root == nullptr)
         {
             return 0;
         }
         int depth = 1;
         queue<TreeNode*> que;
         que.emplace(root);
 ​
         while(!que.empty())
         {          
             int s = que.size();
             for(int i=1;i<=s;i++)
             {
                 TreeNode * cur = que.front();
                 que.pop();
 ​
                 if(cur->left == nullptr && cur->right == nullptr)
                 {
                     return depth;
                 }
                 if(cur->left!=nullptr)
                 {
                     que.emplace(cur->left);
                 }
 ​
                 if(cur->right!=nullptr)
                 {
                     que.emplace(cur->right);
                 }
             }
             // 每下一层,深度加1
             depth ++;
         }
 ​
         return depth;    
     }
     int minDepth(TreeNode* root) { 
         return travel(root);        
     }
 };

复杂度分析

时间复杂度:O(N),其中 N 是树的节点数。对每个节点访问一次。

空间复杂度:O(N),其中 N 是树的节点数。开了一个队列来存储元素,最大值不会超过树的节点数。

题目感悟

遇到题目要考虑一下使用广度还是深度会更优。

更多相关知识:github.com/pingguo1987…