递归

递归 重要性:非常高

数据结构和算法的第2天涵盖了最重要和投资回报率最高的主题。

注:新的递归与解决方案将每天添加。因此,请保持每天检查这个帖子。

让我们开始吧!

什么是递归? 递归是一种程序/函数自我调用的技术。

它比迭代式解决方案有很多优点,例如,它更容易读和写(和可视化),并尽量减少代码的长度。

递归问题的例子 -

一棵树的最大深度

一棵树的直径

反转一棵树

翻转一棵树

顺序/前顺序/后顺序树的遍历

图中的深度优先搜索

数字的阶乘

河内塔等

递归是如何工作的?

alt

主要的要点是--当递归时,机器会记住问题的先前状态,这些信息被保存在激活栈中。

所有被做成递归的函数都有--

基本情况(终止条件)

递归调用(函数自己调用)

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

完整的代码视频解释(正在进行中。

本文由 mdnice 多平台发布

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值