代码随想录算法训练营第16天 | LeetCode104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数


104. 二叉树的最大深度

对于本题而言,我们要理解什么是二叉树的最大深度,最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

既然是求其最大深度,那么我们就要遍历二叉树,就可采用递归遍历的方式来遍历二叉树;确定了是递归遍历,我们又应该思考,用哪种遍历方式来遍历二叉树(前中后序遍历):

如果使用前序遍历,那么我们求得的将是深度

如果使用后序遍历,那么我们求得的将是高度

深度和高度的区别可以理解为“坐标原点”不同,深度的坐标原点在树的根节点,高度的坐标原点在树中离根节点最远的叶子节点。但是本质上来说,求得了高度也就求得了深度。

简单捋了一下思路,现在我们来思考递归应该如何写,根据我的上一篇文章对递归的讲解,我们可把递归分成三步来思考,分别是:

1.确定函数参数和确定函数返回值类型

2.确定终止条件

3.确定单层递归的逻辑

我们一步步来:

第一步:确定函数参数和确定函数返回值类型

求最大深度,返回值当然是int 型,传入的函数参数先暂定为TreeNode* root,如果后面有需要再添加

第二步:确定终止条件

终止条件很简单,当遍历到空节点的时候返回0即可

第三步:确定单层递归的逻辑

确定单层逻辑 

取得左子树的深度//左

取得右子树的深度//右

找到左右两边的最大深度,然后再+1(当前的中间节点)//中

代码如下:

int leftdepth = getdepth(node->left);       // 左
int rightdepth = getdepth(node->right);     // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;

完整代码如下:

class solution {
public:
    int getdepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftdepth = getdepth(node->left);       // 左
        int rightdepth = getdepth(node->right);     // 右
        int depth = 1 + max(leftdepth, rightdepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    }
};


111. 二叉树的最小深度

对于这道题目,要注意与上一题的“二叉树的最大深度”加以区别,上一道题,可以直接用max函数来去左右俩子树的最大深度,但是如果用同样的方法来解这题,使用min函数的话就会掉入陷阱,为什么?大家思考一下,万一左子树是NULL,而右子树是有深度的呢,那么最小深度就是1了,但答案明显不是1

根据递归三部曲,我们先确定函数返回值为int型,函数参数为TreeNode* node,终止条件当然是遍历到空节点的时候,那么对于单层递归函数的逻辑我们应该怎么写呢???

先取得左子树的最小深度//左

再取得右子树的最小深度//右

最后我们判断左右子树是否分别为空:

如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度,

反之,若右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。

具体代码如下

/**
 * Definition for a binary tree node.
 * 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 {
public:
    int getdepth(TreeNode* node){
        if(node==NULL)  return 0;
        int leftdep=getdepth(node->left);//左
        int rightdep=getdepth(node->right);//右
        //中
        if(node->left==NULL&&node->right!=NULL){
            return rightdep+1;
        }
        if(node->left!=NULL&&node->right==NULL){
            return leftdep+1;
        }
        return 1+min(leftdep,rightdep);
    }
    int minDepth(TreeNode* root) {
        if(root==NULL)  return 0;
        return getdepth(root);
    }
};

 
222. 完全二叉树的节点个数

本题是求完全二叉树的节点个数

也是遍历二叉树,上递归三部曲!

确定函数返回类型为int 型,函数参数暂定为TreeNode* root,确定终止条件为遍历到空节点时返回0,单层递归的逻辑为:

确定左子树的节点个数//左

确定右子树的节点个数//右

将左右子树的节点数相加再+1(当前的中间节点)//中

返回

具体代码如下:

/**
 * Definition for a binary tree node.
 * 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 {
public:
    int func_count(TreeNode* node){
        if(node==NULL)  return 0;
        int leftnum=func_count(node->left);//左
        int rightnum=func_count(node->right);//右
        int result=leftnum+rightnum+1;//中
        return result;
    }
    int countNodes(TreeNode* root) {
        return func_count(root);
    }
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值