![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
二叉树
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 · 617 阅读 · 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 · 348 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
整体思想为:先通过先序找到中序中root的位置,再通过中序root的位置找到左子树的区间,和右子树的区间递归左右子树当穿过叶子结点结束public class Offer07 { /** 先通过先序找到中序中root的位置, * 再通过中序root的位置找到左子树的区间,和右子树的区间 * 递归左右子树 * * 当穿过叶子结点结束 * */ private HashMap<Integer,Integer> map原创 2021-11-30 17:13:47 · 64 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
有点类似于二叉树了,从左上角开始,通过不断判断,将边界缩小(类似于这一题顺时针打印列表 https://blog.csdn.net/HUIEX/article/details/121564439) /** 从右上角开始,往下变大,往右边小*/ /** 设置边界 up,down,left,right ,当up < down,right < left,结束查找,即没有找到*/ /** 如果目标数小于当前数,就向右移动,如果目标数大于当前数,就像下移动*/ public原创 2021-11-29 21:29:21 · 149 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
使用递归,终止条件:穿过叶子结点,root == null;子问题和问题的关系:左子树深度与右子树深度的差值小于1,并且左右子树也都为平衡二叉树/** 递归,终止条件:穿过叶子结点,root == null; 子问题和问题的关系:左子树深度与右子树深度的差值小于1,并且左右子树也都为平衡二叉树 * 当前方法为 传入结点,返回该结点下的树是否为平衡二叉树*/ public boolean isBalanced(TreeNode root){ if (root == nu原创 2021-11-27 13:40:43 · 168 阅读 · 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 · 245 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
和上一题 II 一样 https://blog.csdn.net/HUIEX/article/details/121453345在将每一层的list存入结果集前,使用一个标记控制list存入元素的顺序即可public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return new ArrayList<>(); /** 创建一个队列,用来存放下一层原创 2021-11-24 13:58:21 · 275 阅读 · 1 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
和 从上到下打印二叉树 I 差不多,地址:https://blog.csdn.net/HUIEX/article/details/121452218就一个输出形式不一样要解决的问题就是:一层的元素要先存在一个集合中,使用for循环,让该层队列的 所以元素都进行 存进list中 、将下一层的结点存入队列中public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return原创 2021-11-21 14:55:46 · 336 阅读 · 2 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树
层序遍历,广度优先常规的程序遍历public int[] levelOrder(TreeNode root) { if (root == null) return new int[0]; ArrayList<Integer> result = new ArrayList<>(); /** 创建一个队列,用来存放下一层的元素*/ Queue<TreeNode> queue = new LinkedLis原创 2021-11-21 12:52:06 · 333 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
深度优先查找一开始就是普通递归,然后找到之后进行分条件的判断就三种情况,当前结点root的左右两个结点为p、q,则当前结点就是最近公共祖先结点当前结点为p,那么p即当前结点为最近公共祖先结点当前结点为q,那么q即当前结点为最近公共祖先结点 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { /** 递归终止的边界为 当前结点为空,或者当前结点为p,或者q原创 2021-11-21 12:47:49 · 335 阅读 · 1 评论 -
剑指 Offer 55 - I. 二叉树的深度
思路都在注解里 /** 递归终止的边界为 root == null*/ if (root == null) return 0; /** 问题与子问题间的关系 : * 返回左结点深度 * 返回右结点深度 * 比较两个子节点的深度,返回最大的那个 * Math.max(maxDepth(root.left),maxDepth(root.right))*原创 2021-11-19 19:54:25 · 284 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
就是递归 将每个结点的左右子节点交换递归的终止条件机就是 当前结点为叶子结点(也就是没有子节点) ,返回当前结点问题与子问题间的关系就是temp = rightleft = rightright = temppublic TreeNode mirrorTree(TreeNode root) { /** 递归终止的边界为 root == null*/ if (root == null){ return null; }原创 2021-11-19 19:12:07 · 171 阅读 · 0 评论