递归
递归
Huiex胖子君
广告位招租
展开
-
剑指 Offer 26. 树的子结构
递归套递归一开始思路是 在 创建一个函数,进行在A中查找和B的根节点相同的结点,然后再创建一个函数,用来比较刚才在A中找到的子树和B树是否一样提交时发现,给的二叉树可能存在结点值相同,所以就只能 一旦找到A中和B的根节点相同的结点 后,就开始比较 A中子树和B是否一样public class Offer26 { public boolean isSubStructure(TreeNode A, TreeNode B) { /** 终止条件 : 穿过叶子结点 或者 如果当前原创 2021-12-06 10:58:09 · 638 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
二叉搜索树的中序遍历是有序的,所以可以在中序遍历的基础上进行添加将中序遍历中的输出结点替换为本题所需要的结点中间的连接(具体看注解)public class Offer36 { /** 二叉搜索树的中序遍历是有序的,所以可以在中序遍历的基础上进行添加*/ /** 设立两个辅助指针,一个用来指向当前结点,一个指向上一个结点*/ private Node pre; private Node head; public Node treeToDoublyList(No原创 2021-12-05 20:37:23 · 152 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
深度优先 回溯法public class Offer34 { /** 先创建一个List用来存放路径*/ private List<List<Integer>> result = new ArrayList<>();//结果集 private List<Integer> path = new ArrayList<>();//设置一个变量,来判断目前路径是否满足目标路径 public List<List&原创 2021-12-05 19:14:41 · 414 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
因为是搜索二叉树,所以 左结点 < root < 右结点先遍历找到 大于数组最后一个数(也就是root)的索引则 [left,i-1]为右子树的区间,[i,right-1]为左子树的区间判断右子树区间内的数是否都小于 root(也就是postorder[right])判断左子树区间内的数是否都大于 rootpublic class Offer33 { private int[] postorder; public boolean verifyPostorder(int原创 2021-11-30 20:13:06 · 356 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
整体思想为:先通过先序找到中序中root的位置,再通过中序root的位置找到左子树的区间,和右子树的区间递归左右子树当穿过叶子结点结束public class Offer07 { /** 先通过先序找到中序中root的位置, * 再通过中序root的位置找到左子树的区间,和右子树的区间 * 递归左右子树 * * 当穿过叶子结点结束 * */ private HashMap<Integer,Integer> map原创 2021-11-30 17:13:47 · 71 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
使用递归,终止条件:穿过叶子结点,root == null;子问题和问题的关系:左子树深度与右子树深度的差值小于1,并且左右子树也都为平衡二叉树/** 递归,终止条件:穿过叶子结点,root == null; 子问题和问题的关系:左子树深度与右子树深度的差值小于1,并且左右子树也都为平衡二叉树 * 当前方法为 传入结点,返回该结点下的树是否为平衡二叉树*/ public boolean isBalanced(TreeNode root){ if (root == nu原创 2021-11-27 13:40:43 · 175 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
public boolean isSymmetric(TreeNode root) { /** 特殊条件 root == null*/ if (root == null) return true; return is(root.left,root.right); } public boolean is(TreeNode left,TreeNode right){ /** 递归终止条件 * 左边和右边结点都.原创 2021-11-26 17:36:14 · 253 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
思路都在注解里 /** 递归终止的边界为 root == null*/ if (root == null) return 0; /** 问题与子问题间的关系 : * 返回左结点深度 * 返回右结点深度 * 比较两个子节点的深度,返回最大的那个 * Math.max(maxDepth(root.left),maxDepth(root.right))*原创 2021-11-19 19:54:25 · 291 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
就是递归 将每个结点的左右子节点交换递归的终止条件机就是 当前结点为叶子结点(也就是没有子节点) ,返回当前结点问题与子问题间的关系就是temp = rightleft = rightright = temppublic TreeNode mirrorTree(TreeNode root) { /** 递归终止的边界为 root == null*/ if (root == null){ return null; }原创 2021-11-19 19:12:07 · 184 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
先找递归终止的界限 ,找终止界限的前一个情况,找出联系(即递推公式)递归终止的界限 要么 l1 为空l,要么 l2 为空找终止界限的前一个情况,、l1 --> nulll2 -->null联系就是l1.next = mergeTwoLists(l1.next,l2);orl2.next = mergeTwoLists(l1,l2.next);public ListNode mergeTwoLists(ListNode l1, ListNode l2) {原创 2021-11-19 11:37:44 · 289 阅读 · 0 评论 -
合并两个有序链表
递归不会直接用while循环迭代先定义一个结点,ListNode head = new ListNode(-1);,不能用ListNode head = null;然后定义一个辅助指针ListNode prev = head;,主要思想就是辅助指针,根据两个链表边的当前头结点的比较,判断去指向谁,如果l1 != null && l2 != null就开始常规的 指针指向操作了prev.next = l1; l1 = l1.next; prev = prev.next;然后原创 2021-10-30 15:47:45 · 82 阅读 · 1 评论 -
241. 为运算表达式设计优先级
分治分治的本质就是拆分成最小的部分进行操作字符串通过调用递归进行运算符的拆分,拆分成一个个独立的运算结果,然后进行运算得到最终的结果 public static ArrayList<Integer> diffWaysToCompute(String expression) { ArrayList<Integer> res = new ArrayList<Integer>(); for(int i = 0;i < expressi原创 2021-10-26 11:28:30 · 78 阅读 · 0 评论