递归算法(练习习题)

递归:自己调用自己

递归模板:

def recursion(level, param1, param2, ....):
	#第一部分:递归终止条件
	if level > MAX_LEVEL:
	process_result
	return
	
	#该层所需执行的操作
	process(...)
	#下探到下一层
	self.recursuion(level+1, p1,...)
	#其他操作

总结:
第一部分:递归终止条件。
第二部分:该层所需解决的程序。
第三部分:下探到下一层。

leetcode 733.图像渲染

例题:
在这里插入图片描述
题目简易概述:
给定一个二维数组,指定将一个元素改变,使在该二维数组中与指定元素能上下左右连成一片的相同颜色全部改变。如图:
在这里插入图片描述
递归主要代码:

void apply_color(int** image, int imageSize, int* imageColSize, int sr, int sc, int newColor,int oldColor){
    //递归推出条件
    if(sc < 0 || sc >= *imageColSize)
        return;
    if(sr < 0 || sr >= imageSize)
        return;

    //递归执行层
    if(image[sr][sc] == oldColor ){
        image[sr][sc] = newColor;
        apply_color(image, imageSize, imageColSize, sr - 1, sc, newColor, oldColor);	//向左慢慢渲染
        apply_color(image, imageSize, imageColSize, sr + 1, sc, newColor, oldColor);	//向右慢慢渲染
        apply_color(image, imageSize, imageColSize, sr, sc - 1, newColor, oldColor);	//向上慢慢渲染
        apply_color(image, imageSize, imageColSize, sr, sc + 1, newColor, oldColor);	//向下慢慢渲染
    }
    return;
}

代码分析:

传入参数说明:
image 传入的二维数组
imageSize 传入数组的横向长度
imageColSize 传入数组的纵向长度
sr 目标的X轴坐标
sc 目标的Y轴坐标
newColor/oldColor 新旧颜色

在重点理解递归的这四句话:

        apply_color(image, imageSize, imageColSize, sr - 1, sc, newColor, oldColor);
        apply_color(image, imageSize, imageColSize, sr + 1, sc, newColor, oldColor);	
        apply_color(image, imageSize, imageColSize, sr, sc - 1, newColor, oldColor);	
        apply_color(image, imageSize, imageColSize, sr, sc + 1, newColor, oldColor);	

递归运作流程:

在这里插入图片描述

leetcode 110.平衡二叉树

在这里插入图片描述
做题疑点:
平衡二叉树的高度是什么?
树的高度指的是分支后到最后一个,入题目中:
第一个图标号为3的左子树高度为1,右子树高度为2。
第一个图标号为1的左子树高度为3,右子树高度为1。

代码如下:

int max_root(struct TreeNode* root){
    if(!root)
        return 0;
    int S1 = 0, S2 = 0;
    S1 = 1 + max_root(root->right);
    S2 = 1 + max_root(root->left);
    return (S1 > S2 ? S1 : S2);
}

bool isBalanced(struct TreeNode* root){
    if(!root)
        return true;
    int hl =0, hr = 0;
    hl = max_root(root->left);
    hr = max_root(root->right);

    if(hl - hr > 1||hr - hl > 1)
        return false;

    return isBalanced(root->left) && isBalanced(root->right); 
}

代码分析:
第一个函数中目的是运用递归思想将,找出该分支的最大高度。
第二个函数是先计算根节点的左子树最高高度,和右子树最高高度,然后进行比较。

return isBalanced(root->left) && isBalanced(root->right);

分析: 因为题目要求每个节点左右树差不能大于一,所以最后一句就是用来递归验证每一个节点树的高度差。

第三题:
2020/8/21
在这里插入图片描述
题目解析:与110号题目类似,该题与110号题目不同之处:

  1. 该题目寻找的是深度最小的枝
  2. 最小深度的定义是,根到叶子节点的最小深度。

辣鸡小陈代码:

int min_balance(struct TreeNode* root){
    int s1 = 0, s2 = 0;
    if(!root)
        return 0;
    s1 = 1 + min_balance(root->left);		//s1 & s1分别遍历左右子树
    s2 = 1 + min_balance(root->right);		
    if((s1 == 1&&s2 > 1)||(s2 == 1&&s1 > 1))//抛除掉整棵树只有左子树全无右子树情况
        return (s1 > s2 ? s1 :s2);
    return (s1 > s2 ? s2 :s1);
}

int minDepth(struct TreeNode* root){
    return min_balance(root);
}

观摩大佬代码:

int minDepth(struct TreeNode* root){
    if (root == NULL) {						//递归终止条件
        return 0;
    }
    int left, right, ret;
    left = minDepth(root->left);			//遍历左右子树
    right = minDepth(root->right);

    if (left && right) {
        return left < right ? left + 1 : right + 1;
    }

    return left + right + 1;			//抛除掉全树只有左或右子树情况
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值