算法笔记——递归 Leetcode#104、#110

什么是递归?递归就是程序直接或者间接地反复调用自身的一种方法。
要写出递归函数的代码,首先要弄清楚递归的两个组成部分:
1)递归体:表示在每一级的递归中,要实现什么功能。
2)递归终止条件:表示递归在什么时候结束。
而递归过程中的每一级递归功能都是一样的,事实上,我们在写代码时只需要关注某一级的递归体即可,而连接多级递归体的是什么呢?是每一级函数的返回值。因此,我们需要思考清楚我们需要用到哪些返回值。

以下是Leetcode上一些相关的习题,在此总结一下:

1. Leetcode#104

1.1 题目描述

在这里插入图片描述

1.2 解题思路

题目要求是求二叉树的最大深度,然后实现上面提到的三步:
1)返回值:我们需要求的是二叉树的最大深度,那么返回值应该是当前子树的最大深度。
2)递归体:选择左右子树中更大的深度加上1作为当前以root为根结点的子树的最大深度,然后返回该值。
3)递归终止条件:树为空的时候,递归结束,返回树的深度为0。

1.3 实现代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int leftDepth = maxDepth(root -> left);
        int rightDepth = maxDepth(root -> right);
        return root== NULL ? 0 : max(leftDepth, rightDepth) + 1;
    }
};

2.Leetcode#110

2.1 题目描述

在这里插入图片描述

2.2 解题思路

题目要求是求一棵树是否是二叉树平衡树,然后实现上面提到的三步:
1)返回值:我们需要求的是否是二叉树平衡树,那么返回值应该是一个能够表示二叉树是否是二叉平衡树的数值,可以是bool型,也可以是int型,具体还要看我们的计算过程需要用到哪些返回的信息。我们需要弄清楚以下几个问题:

  • 什么是平衡二叉树?题目中有解释:一个二叉树的每个节点的左右两个子树的高度差的绝对值不超过1。那么一个二叉平衡树的任意一个节点,要满足以下条件:1. 左、右子树都是二叉平衡树;2. 左、右子树的高度差不大于1。
  • 在实现功能的过程中,我们提到只要关注其中一级的计算,也就是说,我们只要关注一颗二叉树的左、右节点以及根节点。那么我们需要得到一个表示以左、右节点为根节点的子树是否为平衡二叉树的bool型数值,还需要得到以左、右节点为根节点的子树的深度的int型数值。因此我们单独定义个ReturnNode类来作为返回值:
class ReturnNode{
private:
	bool isB;
	int depth;
public:
	ReturnNode(bool isB, int depth) {
		this.isB = isB;
		this.depth = depth;
	}
}

但是仔细回想,单独定义一个返回值的类的方法虽然很直观,却让代码变得更为复杂,观察后发现,bool型数值是非0即1的数,通常作为一个标志(flag)来使用,比如是否是平衡二叉树,而int型数值中包含了bool型,我们可以从int型数值中取出两个我们在本题中未使用的数字来代表0/1,而我们使用int型数值来表示二叉树的深度,二叉树的深度最小值为0,那么我们可以用大于等于0的数来代替bool数值中的1,表示二叉树是平衡树;用小于0的某个数,比如-1代替bool数值中的0,表示二叉树不是平衡树。这样递归体的每一级就只需要返回一个int型的数值。
2)递归体:判断左、右子树是否为二叉树、左右子树的高度差是否为1,不是的话返回-1,是的话返回当前以root为根结点的子树的最大深度,即左右子树中更大的深度加上1。
3)递归终止条件:树为空的时候,递归结束,返回树的深度为0。

2.3 实现代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }
    int height(TreeNode* root) {
        if(root == NULL) return 0;
        int h_left = height(root -> left);
        int h_right = height(root -> right);
        if(h_left >= 0 && h_right >= 0 && abs(h_left - h_right) <= 1) {
            //满足上面3种情况,说明平衡了,树的深度为左右俩子树最大深度+1
            return max(h_left, h_right) + 1;
        } else {
            return -1;
        }
    }
};

参考文章:

[1] https://lyl0724.github.io/2020/01/25/1/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值