• 【Leetcode】【Easy】Minimum Depth of Binary Tree


    Given a binary tree, find its minimum depth.

    The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

    递归的解题思路:

    递归当前结点,分一下四种情况考虑:①结点为空时返回0;②结点没有右子树时,返回左子树最小值+1;③结点没有左子树时,返回右子树最小值+1;④当结点双子齐全时,返回左右子树的最小值+1;

    注意:

    1、注意判断“只有左子树”或“只有右子树”的情况,不要暴力的直接返回左/右子树最小值,因为有可能不存在;

    2、省去了“当结点为叶子结点,则返回1”的情况,减少了代码行数,不过会多递归一层,运行时间没有变化;

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int minDepth(TreeNode *root) {
    13         if (!root)
    14             return 0;
    15 
    16         int minLeft = minDepth(root->left);
    17         int minRight = minDepth(root->right);
    18         
    19         if (minLeft == 0) 
    20             return minRight + 1;
    21         else if (minRight == 0)
    22             return minLeft + 1;
    23         else return min(minLeft,minRight) + 1;
    24     }
    25 };

    【★】迭代的解法:

    用按层遍历二叉树的思想,当遍历到第一个叶子结点时,输出此时树的深度,则为最小depth。

    用数组保存待遍历的树,设置双指针,一个指向访问当层开始的节点,一个指向访问当层结束节点的下一个位置。

     1 class Solution {
     2 public:
     3     int minDepth(TreeNode *root) {
     4         vector<TreeNode *> treeVec;
     5         treeVec.push_back(root);
     6         int cur = 0;
     7         int end;
     8         int depth = 0;
     9         
    10         if (!root) 
    11             return 0;
    12         
    13         while (cur < treeVec.size()) {
    14             depth++;
    15             end = treeVec.size();
    16             while (cur < end) {
    17                 if (!treeVec[cur]->left && 
    18                     !treeVec[cur]->right) {
    19                     return depth;    
    20                 }
    21                 
    22                 if (treeVec[cur]->left) 
    23                     treeVec.push_back(treeVec[cur]->left);
    24                 
    25                 if (treeVec[cur]->right) 
    26                     treeVec.push_back(treeVec[cur]->right);
    27                     
    28                 cur++;
    29             }
    30         }
    31     }
    32 };

    附录:

    按层遍历二叉树

  • 相关阅读:
    分页 存储过程
    Base64编码
    汉字转拼音 完整类
    C#利用SharpZipLib解压或压缩文件夹实例操作
    C#压缩解压zip 文件
    MapReduce shuffle原理
    设计模式(一)—— 代理模式
    Lombok的基本使用
    解决idea 每次新建项目需要重新配置maven
    10-20 Spring框架(三)—— AOP核心
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4122233.html
Copyright © 2020-2023  润新知