[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

 

posted @ 2020-07-08 00:30  谁在写西加加  阅读(118)  评论(0编辑  收藏  举报