zoukankan      html  css  js  c++  java
  • [LeetCode] 104/111. Maximum Depth of Binary Tree 二叉树的最大/最小深度

    CategoryDifficultyLikesDislikes
    algorithms Easy (73.29%) 591 -

    TagsCompanies

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

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

    示例:
    给定二叉树 [3,9,20,null,null,15,7]

        3
       / 
      9  20
        /  
       15   7

    返回它的最大深度 3 。

    方法一:使用 102 题求二叉树的层数,层数即是最大深度。

    方法二:递归地求左右子树的最大深度,取两者最大值+1。

    两种方法代码如下:

    /*
     * @Descripttion: 
     * @version: 
     * @Author: wangxf
     * @Date: 2020-07-07 22:59:43
     * @LastEditors: Do not edit
     * @LastEditTime: 2020-07-08 00:01:54
     */ 
    /*
     * @lc app=leetcode.cn id=104 lang=cpp
     *
     * [104] 二叉树的最大深度
     */
    
    // @lc code=start
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    struct NodeInfo
    {
        TreeNode* ptr = nullptr;
        int level = 0;
        NodeInfo(TreeNode* node_ptr,int node_level):
        ptr(node_ptr),level(node_level)
        {}
    };
    
    class Solution {
    public:
        int maxDepth(TreeNode* root) 
        {
            //方法一:层次遍历,树的层树则为树的最大深度
           // return level_traverse_helper(root);
            //方法二:递归求左子树,右子树的最大深度,取两者的最大值+1
            return maxDepth_recursion(root);
        }
    
        int level_traverse_helper(TreeNode* root)
        {
            std::vector<vector<int>> res;
            if(!root) return 0;
            std::queue<NodeInfo> q;
            NodeInfo root_node(root,0);
            q.push(root_node);
            while(!q.empty())
            {
                NodeInfo cur_node = q.front();
                q.pop();
                int cur_level = cur_node.level;
                int cur_node_val = cur_node.ptr->val;
                if(res.size()<cur_level+1)
                {
                    vector<int> tempVec;
                    res.push_back(tempVec);
                }
                res[cur_level].push_back(cur_node_val);
                if(cur_node.ptr->left)
                {
                   NodeInfo leftNode(cur_node.ptr->left,cur_level+1);
                   q.push(leftNode);
                }
                if(cur_node.ptr->right)
                {
                   NodeInfo rightNode(cur_node.ptr->right,cur_level+1);
                   q.push(rightNode);
                }
            }
            int res_size = res.size();
            return res_size;
        }
    
        int maxDepth_recursion(TreeNode* root)
        {
            if (!root) //对空树测试用例,返回0
            {
                return 0;
            }
            if((!root->left)&&(!root->right))//leaf node
            {
                return 1;
            }
            int left_max_depth = maxDepth_recursion(root->left);
            int right_max_depth = maxDepth_recursion(root->right);
            int max_depth = max(left_max_depth,right_max_depth)+1;
            return max_depth;
        }
    };
    // @lc code=end

     方法二同理可以求二叉树的最小深度,代码如下:

     1 /*
     2  * @Descripttion: 
     3  * @version: 
     4  * @Author: wangxf
     5  * @Date: 2020-07-07 23:12:22
     6  * @LastEditors: Do not edit
     7  * @LastEditTime: 2020-07-07 23:46:05
     8  */ 
     9 /*
    10  * @lc app=leetcode.cn id=111 lang=cpp
    11  *
    12  * [111] 二叉树的最小深度
    13  */
    14 
    15 // @lc code=start
    16 /**
    17  * Definition for a binary tree node.
    18  * struct TreeNode {
    19  *     int val;
    20  *     TreeNode *left;
    21  *     TreeNode *right;
    22  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    23  * };
    24  */
    25 class Solution {
    26 public:
    27     int minDepth(TreeNode* root)
    28     {
    29         if (!root) //对空树测试用例,返回0
    30         {
    31             return 0;
    32         }
    33         return minDepthHelper(root);
    34     }
    35 
    36     int minDepthHelper(TreeNode* root)
    37     {
    38         if (!root) //若子树为空,则只考虑另一子树的最小深度,另一子树也为空的情况是上层节点是叶子节点,下面单独考虑
    39         {
    40             return 0x7fffffff;
    41         }
    42         if((!root->left)&&(!root->right))//leaf node
    43         {
    44             return 1;
    45         }
    46         int left_min_depth = minDepthHelper(root->left);
    47         int right_min_depth = minDepthHelper(root->right);
    48         int min_depth = min(left_min_depth,right_min_depth)+1;
    49         return min_depth;
    50     }
    51 };
    52 // @lc code=end
  • 相关阅读:
    CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
    Curl运维命令
    kafka 基础知识梳理及集群环境部署记录
    RocketMQ 简单梳理 及 集群部署笔记
    Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
    Redis+Keepalived高可用环境部署记录
    Centos下Nodejs+npm环境-部署记录
    基于Ping和Telnet/NC的监控脚本案例分析
    linux dig 命令使用方法
    dnsjava usage
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/13264427.html
Copyright © 2011-2022 走看看