![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
递归
Betternw
这个作者很懒,什么都没留下…
展开
-
判断t1树中是否有与t2树拓扑结构完全相同的子树
题目描述给定彼此独立的两棵二叉树,判断 t1 树是否有与 t2 树拓扑结构完全相同的子树。设 t1 树的边集为 E1,t2 树的边集为 E2,若 E2 等于 E1 ,则表示 t1 树和t2 树的拓扑结构完全相同。示例1输入:{1,2,3,4,5,6,7,#,8,9},{2,4,5,#,8,9}返回值:true代码 public boolean isContains (TreeNode root1, TreeNode root2) { // write code her原创 2021-08-08 15:21:14 · 404 阅读 · 0 评论 -
24 两两交换链表中的节点
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]分析递归解法:返回值:交换完成的子链表调用单元:设需要交换的两个点为 head 和 next,head 连接后面交换完成的子链表,next 连接 head,完成交换终止条件:head 为空指针或者 next 为空指针,也就是当前无节点或者只有原创 2021-07-22 16:45:16 · 82 阅读 · 0 评论 -
1143 最长公共子序列 最长公共前缀
题目描述给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 =原创 2021-07-21 09:56:26 · 137 阅读 · 0 评论 -
112 路径总和
题目描述给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true分析若当前节点就是叶子节点,那么直接判断 sum 是否等于 val 即可(因为路径和已经确定,就是当前节点的值,我们只需原创 2021-07-19 21:20:26 · 62 阅读 · 0 评论 -
【递归】110 平衡二叉树
题目判断一个二叉树是否为平衡二叉树分析平衡二叉树:左右子树高度差不大于1.因为一个树中,每个节点的子树都是平衡二叉树,那么整个树就是。使用递归。判断每个节点子树是否是:左子树是否是:右子树是否是?左右高度差是否小于1?是的话,返回高度。定义ReturnData类:每个类返回的值(是否是平衡二叉树,子树高度)。定义process方法:节点参数传入。如果节点为空,返回true。递归判断左子树是否是,右子树是否是,高度差是否小于1,满足的话返回(true,高度)递归方法相当于从叶节点开始判断,从叶节原创 2020-06-08 23:21:25 · 114 阅读 · 0 评论 -
【递归】 汉诺塔问题
题目在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。你需要原地修改栈。输入:A = [2, 1, 0], B = [], C = []输出:C = [2, 1, 0]输入:A = [1, 0], B = [], C = []输原创 2020-06-29 10:14:25 · 122 阅读 · 0 评论 -
[dfs bfs] 199 二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]1 <—/ 2 3 <—\ 5 4 <—思路dfs,按照根、右、左的顺序遍历,可以保证每层第一个访问的是最右边的节点。用深度做比较,结果集中存放的元素个数,和深度是对应的。当遍历到新的一层时,如果depth==结果集大小,说明原创 2020-07-01 19:42:06 · 130 阅读 · 0 评论 -
【dfs】 108将有序数组转换成二叉搜索树
题目将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。思路二叉搜索树中序遍历就是升序数组。又因为是平衡树,所以以中间元素作为根节点代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} public TreeNode so原创 2020-07-03 16:56:04 · 66 阅读 · 0 评论 -
【递归】 145 二叉树的后序遍历
题目给定一个二叉树返回他的后序遍历思路非递归用两个栈实现。第一个栈是前序的思路,放入根右左,(代码顺序是根左右),第二个栈实现逆序的功能代码递归:public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); helper(root,res); return res;}public void helper(T原创 2020-07-01 15:16:54 · 69 阅读 · 0 评论 -
【递归】 144 二叉树的前序遍历
题目给定一个二叉树返回他的前序遍历输入: [1,null,2,3]12/3输出: [1,2,3]思路前序和中序遍历只需要改变一下记录根节点的顺序。代码递归: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} public List<Integer> preorderTraversal(Tree原创 2020-07-01 14:45:33 · 74 阅读 · 0 评论 -
【递归??】 offer33 二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。5/ 2 6/ 1 3输入: [1,6,3,2,5]输出: false输入: [1,3,2,6,5]输出: true分析最后一个是根节点,找到左子树和右子树,然后递归判断。当只有一个节点的时候,符合要求,找左子树的时候左边区域一定都是小于根节点的,判断右子树,当寻找右子树指针和根节点重合说明不符合要求。代码public b原创 2020-07-08 00:23:30 · 104 阅读 · 0 评论 -
【递归 先序】 offer26 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路相当于先序遍历,采用fun方法判断以当前节点为根节点是否相同。fun相当于可以帮助判断从哪个节点开始判断。如果不相同,递归判断A的左子树和A的右子树,代码public boolean isSubStructure(TreeNode A, TreeNode B) { if(A==null||B==null) return false; /原创 2020-07-06 22:42:29 · 86 阅读 · 0 评论 -
【递归】offer13 机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?输入:m = 2, n = 3, k = 1输出:3输入:m = 3, n = 1, k =原创 2020-07-04 19:48:46 · 135 阅读 · 0 评论 -
【递归】 617合并二叉树
题目给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路return是为了判断特殊情况然后中止程序。递归判断该节点的左右应取什么值。这个递归是从上往下的,且...原创 2020-06-12 10:58:33 · 89 阅读 · 0 评论 -
【递归】543 二叉树的直径
题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。1/ 2 3/ \4 5返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。分析最长路径,不一定是路过根节点的。是任意两个节点之间的。因此要记录以每个节点为根节点的直径情况:左子树高度加右子树高度。这其中最大的数字才是最长路径。每一次递归的返回值,返回的是当前深度加一。这样就是上一层节点的深度。最后一层递归实际求出来的就是最原创 2020-06-15 00:19:47 · 178 阅读 · 0 评论 -
【递归】 538把二叉搜索树转换为累加树
题目给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。输入: 原始二叉搜索树:5/ 2 13输出: 转换为累加树:18/ 20 13思路二叉搜索树,要想到中序遍历。写出最后的结果集合,每个数字的值就是后者所有的累加。因此就是反向中序遍历,并把每次的节点值进行累加。代码public class TreeNode { int val;原创 2020-06-12 16:00:33 · 124 阅读 · 0 评论 -
【递归回溯】494 目标和
题目给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3共5种思路因为对于前一层,不是加就是减,因此分两个值计算。最后累加,就是次数。代码//因为要原创 2020-06-27 10:22:25 · 147 阅读 · 0 评论 -
【递归 两个递归】 437 路径总和
题目给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 810/ 5 -3/ \ 3 2 11/ \ 3 -2 1返回 3。和等于 8 的路径有:5 -> 35 -> 2 -> 1-3 -> 11思路原创 2020-06-10 16:43:55 · 141 阅读 · 0 评论 -
297 二叉树的序列和反序列化【前序实现】
题目设计一个算法实现二叉树的序列化和反序列化分析序列化:当前节点为null时候,返回“#”。当前节点为数字时,字符串累加数字+“!”。最后返回的字符串结果就是1!2!##3!#反序列化:创建数组,使用!分割符号。然后将数组的值放入队列。队列的值弹出,先弹出头结点,如果是#则返回null,然后使用递归弹出head.left和head.right。(因为是递归,所以不用考虑循环问题。写一次的代码就思考一次的情况即可。)代码public static class TreeNode { publ原创 2020-06-08 21:31:00 · 120 阅读 · 0 评论 -
【递归 递归左右,比较存在】 236 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。思路当左右都是空,则左右子树都没有qp,返回null如果左右都不为空,pq在异侧,...原创 2020-06-26 18:51:05 · 97 阅读 · 0 评论 -
【递归 自底向上 交换当前的左右,递归交换左交换右】 226 翻转二叉树
题目翻转一颗二叉树输入:4/ 2 7/ \ / 1 3 6 9输出:4/ 7 2/ \ / 9 6 3 1分析交换每个节点的左右节点,递归向上。注意:直接交换操作就行。不用考虑其他值。(被链表的next啥的给扰乱思路,其实直接交换值就可以。)代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(原创 2020-06-10 12:03:36 · 110 阅读 · 0 评论 -
【深度搜索 有1就感染成2,统计第一个1的个数。 并查集】200 岛屿数量
题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。输入:11110110101100000000输出: 1输入:11000110000010000011输出: 3思路深度或者广度遍历,遇到1就变成2,然后递归该节点周围的所有节点,当超出范围或不为1(0,2)时退出循环。主函数中遇到1就岛屿数量加1.大矩阵,将矩阵划分,在进行变2的过程中,记录每次开始变2的点是原创 2020-06-12 10:38:00 · 105 阅读 · 0 评论 -
【递归 左、右、当前、返回子树】 124 二叉树的最大路径和
题目给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。题目链接思路递归,算出以当前节点为根节点的最大路径之和,返回的当前层的最大子树加上自身值。递归步骤:当前计算方式,递归公式,返回上一层的值。负数不参与路径计算。代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode原创 2020-06-23 19:24:17 · 185 阅读 · 0 评论 -
【递归 分治】 114 二叉树展开为链表
题目给定一个二叉树,原地将它展开为单链表思路遍历每个节点,用暂时节点保存右子树,将左子树连接到根的右边,然后找到最右的节点,把右子树连接上。递归。图解代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left,原创 2020-06-23 18:28:07 · 109 阅读 · 0 评论 -
【递归 哈希表 根据根节点位置划分左右】 105从前序和中序遍历序列构造二叉树
题目根据一棵树的前序遍历与中序遍历构造二叉树。前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]3/ 9 20/ 15 7思路【根 左子树 右子树】【左子树 根 右子树】只要中序遍历定位到根节点,就知道左右子树的节点数目,然后递归继续求左右子树的根节点。中序遍历的定位可以用哈希表快速实现。代码 public class TreeNode { int val; TreeNode left;原创 2020-06-23 17:57:01 · 185 阅读 · 0 评论 -
【递归 辅助函数,判断两个节点的值是否相等】 101对称二叉树
题目给定一个二叉树 检查是否是镜像对称的分析镜像的二叉树:结点1的左子树和结点2的右子树值相等。如果都为空:是镜像的如果一空一不空:不是镜像的如果值不相等:不是镜像的使用递归,递归函数写在第一个函数中,传入的参数的节点的左右孩子。递归函数:左右孩子进行上述判断,如果都符合,那么递归向上判断。这里有个小技巧:因为是判断比较两个节点的左右子树值,因为最后return的是两个函数的与结果。每一层递归与的结果都为true时候,最外层递归结果才为true。public static class原创 2020-06-09 14:32:11 · 291 阅读 · 0 评论 -
【递归 分段反转链表,进行连接】 25 K个一组翻转链表
题目给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5思路代码public ListNode reverseKGroup(ListNod原创 2020-07-01 16:27:56 · 120 阅读 · 0 评论 -
【迭代:helper 不空迭左,加入集合,不空迭右】【非迭代:一直到最左,弹出入集,看右是否在】94 二叉树的中序遍历
题目给定一个二叉树,返回他的中序遍历分析递归:中序左——打印——中序右非递归:空右不空左。设置一个栈,先将头结点压入栈中。head为移动指针。如果当前节点不为空,则将左边全部压入栈。如果当前节点为空,则弹出并打印,找到打印节点的右边,判断是否为空。代码//迭代public void preOrderRecur1(Node head){ if(head==null){ return; } preOrderRecur1(head.left); Sy原创 2020-06-08 16:53:50 · 115 阅读 · 0 评论 -
【递归 每次锁定一半】 4 寻找两个正序数组的中位数
题目给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。nums1 = [1, 3]nums2 = [2]中位数为2nums1 = [1, 2]nums2 = [3, 4]中位数为(2 + 3)/2 = 2.5思路如果要找第k小的数字,就循环每次排除掉第k/2的数字。两个数字同时指向当前第k/2个数字,当前数字哪个小原创 2020-06-24 10:16:51 · 113 阅读 · 0 评论