递归:自己调用自己
递归模板:
def recursion(level, param1, param2, ....):
#第一部分:递归终止条件
if level > MAX_LEVEL:
process_result
return
#该层所需执行的操作
process(...)
#下探到下一层
self.recursuion(level+1, p1,...)
#其他操作
总结:
第一部分:递归终止条件。
第二部分:该层所需解决的程序。
第三部分:下探到下一层。
例题:
题目简易概述:
给定一个二维数组,指定将一个元素改变,使在该二维数组中与指定元素能上下左右连成一片的相同颜色全部改变。如图:
递归主要代码:
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);
递归运作流程:
做题疑点:
平衡二叉树的高度是什么?
树的高度指的是分支后到最后一个,入题目中:
第一个图标号为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号题目不同之处:
辣鸡小陈代码:
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; //抛除掉全树只有左或右子树情况
}