codeye
2022/10/27阅读:31主题:默认主题
递归
递归 重要性:非常高
数据结构和算法的第2天涵盖了最重要和投资回报率最高的主题。
注:新的递归与解决方案将每天添加。因此,请保持每天检查这个帖子。
让我们开始吧!
什么是递归? 递归是一种程序/函数自我调用的技术。
它比迭代式解决方案有很多优点,例如,它更容易读和写(和可视化),并尽量减少代码的长度。
递归问题的例子 -
一棵树的最大深度
一棵树的直径
反转一棵树
翻转一棵树
顺序/前顺序/后顺序树的遍历
图中的深度优先搜索
数字的阶乘
河内塔等
递归是如何工作的?

主要的要点是--当递归时,机器会记住问题的先前状态,这些信息被保存在激活栈中。
所有被做成递归的函数都有--
基本情况(终止条件)
递归调用(函数自己调用)
def func_name():
#Recursive call to function func()
#递归调用函数func()
func_name()
递归在符合/满足基本情况时终止。它使用堆栈内存中的额外空间。
递归问题中的重要模式和技术
递归函数通过调用自身的一个副本来解决一个问题,并递归地划分和解决原始问题的较小的子问题。
模式→以下问题属于递归(不限于此)。
顺序/前顺序/后顺序树的遍历
图中的深度优先搜索
一个数字的阶乘
河内塔等
最重要的问题与解决方案
注:每天都会有新的递归问题和解决方案加入。因此,请保持每天检查这个帖子。
黄金法则是--通过实践/执行来学习
在这里我们将看到最重要的递归问题。
反转二叉树 问题 -
给出一棵二叉树的根,反转该树,并返回其根。
例子:
Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,3,1]
Solution :
解决方案 :
主要逻辑/想法 -
主逻辑--在左树上反转(通过递归地调用invertTree函数)。在右树上反转右树(通过递归地调用invertTree函数)。将右键分配给左键,反之亦然。
主要逻辑实现 -
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
#如果不是根:
# 返回无
if not root:
return None
temp = root.left
root.left = root.right
root.right = temp
self.invertTree(root.left)
self.invertTree(root.right)
return root
问题链接:
类似的模式--
反转二叉树的奇数层
翻转等价二进制树 问题 -对于一棵二叉树T,我们可以定义一个翻转操作如下:选择任何一个节点,并交换左右子树。
当且仅当我们能在一定数量的翻转操作后使X等于Y时,二叉树X与二叉树Y是翻转等价的。
给出两棵二叉树的根root1和root2,如果这两棵树是翻转等价的,返回true,否则返回false。
例子:
Input:
root1 = [1,2,3,4,5,6,null,null,null,7,8]
root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]
Output: true
解决方案:
主要逻辑/想法 -
主要要点是--翻转左右子树,递归地翻转根部(左右)。如果树的节点/根值不相等,则返回False。
主要逻辑 实现 -
def flipEquiv(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
if not root1 or not root2:
return not root1 and not root2
if root1.val != root2.val:
return False
ans = (self.flipEquiv(root1.left,root2.left) and self.flipEquiv(root1.right,root2.right)) or (self.flipEquiv(root1.left,root2.right) and self.flipEquiv(root1.right,root2.left))
return ans
问题链接
类似模式--
从叶子开始的最小的字符串
二叉树涂色游戏
删除给定值的叶子
二叉树无序遍历 问题 -
给出一棵二叉树的根,返回其节点值的无序遍历。
例子。
Input: root = [1,null,2,3]
Output: [1,3,2]
Solution :
主要逻辑/想法 -
主要逻辑是遵循Inorder traversal规则 - 左、根、右。
因此,首先遍历左子树,然后是根,然后是右子树。
主要逻辑 实现 --
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
ans = []
def ino(root):
if not root:
return
ino(root.left)
ans.append(root.val)
ino(root.right)
ino(root)
return ans
问题链接
类似的模式--
二进制搜索树中的依次继承者
将二进制搜索树转换为排序的双链表
BST节点间的最小距离
最接近的二进制搜索树值II
完整的代码视频解释(正在进行中。
作者介绍