
递归算法
递归练习
YXXYX
精通CV编程
展开
-
968. 监控二叉树(递归+贪心)
给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1: 输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。 示例 2: 输入:[0,0,null,0,null,0,null,null,0] 输出:2 解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。 提示: 给定树的节点数的范围是 [1, 1000]。 每个节点的值都是 0。原创 2021-08-14 10:46:53 · 243 阅读 · 0 评论 -
105从前序与中序遍历序列构造二叉树 && 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)
引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程; 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导一下) 1,先看前序的第一个元素first,这个元素值就是根节点的元素值 2,从中序遍历中找到该元素first,该元素左边的所有元素就是二叉树的左子树上的节点,右边的所有元素就是二叉树右子树的节点,即将中序遍历结果分为了两部分 3,单看中序遍历左边,左边所有元素谁在先序遍历前面谁就是左树的根节点,右树一样(其实原创 2021-08-08 12:31:36 · 161 阅读 · 0 评论 -
21. 合并两个有序链表(C语言)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [], l2 = [0] 输出:[0] 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列 这道题我看了力扣的官方解原创 2021-04-10 11:27:41 · 1431 阅读 · 0 评论 -
递增顺序搜索树
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 示例 1: 输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9] 输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9] 示例 2: 输入:root = [5,1,7] 输出:[1,null,5,null,7] 这道题没有什么难度,非常适合原创 2021-05-22 17:14:21 · 287 阅读 · 0 评论 -
平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:true 示例 2: 输入:root = [1,2,2,3,3,null,null,4,4] 输出:false 示例 3: 输入:root = [] 输出:true 提示: 树中的节点数在范围 [0, 5000] 内 -104 <= Node.val <原创 2021-05-23 17:24:38 · 132 阅读 · 0 评论 -
打印折痕方向(二叉树应用)
请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向。 例: N=1时,打印:down N=2时,打印:down down up 这道题可以先拿个纸条折一下试试(略),会发现其中的规律: 第一次折 折痕记为1凹 第二次折 折痕记为2凹,2凸原创 2021-07-09 18:30:32 · 192 阅读 · 0 评论 -
最大搜索二叉子树大小(树形dp)
给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树 (二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 ); 思路: 这是一道分析可能性求解在二叉树上做类似动态规划的问题(树形dp),这种题就是一种递归套路,我们要分析求解的可能性,并由此找到我们所需要的信息,进而通过递归求解; 这道题有两种可能性: 1,与头节点无关 所需信息: 1.1,左树最大二叉搜索树大小 1.2,右树最大二叉搜索树大小 2,与头节点有关 所需信息: 2.1,左树为二叉搜索树 2.2,右树为二叉搜索树 2原创 2021-07-12 11:51:16 · 307 阅读 · 0 评论 -
逆序栈(递归⚠)
给你一个栈,请逆序这个栈; 不能申请额外的数据结构,只能使用递归求解; 题解: 这道题难点就在于无法申请额外数据结构,可以用两个递归函数实现; 第一个递归函数GetBottom()主要用途是将栈底的数据出栈,并返回该数据的值; 所以我们可以使用递归让栈内的数据依次出栈,直到最后一个数据出栈后栈为空返回该数据的值,递归开始往回走,让之前出栈的值再依次进栈。 第二个递归函数Reverse()就是将栈逆序了; 这就需要我们开始调用GetBottom()函数将栈底数据先出栈,然后依次出栈,直到栈为空,此时最后一个出原创 2021-07-13 19:26:16 · 489 阅读 · 0 评论 -
二叉树的最近公共祖先(递归)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1原创 2021-07-15 12:20:01 · 743 阅读 · 1 评论