zoukankan      html  css  js  c++  java
  • 【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 };

    附录:

    按层遍历二叉树

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4122233.html
Copyright © 2011-2022 走看看