![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
kkkkuuga
这个作者很懒,什么都没留下…
展开
-
leetcode968. 监控二叉树
1.题目描述:给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。2.贪心算法:永远是父结点上放监控能得到总数小(从上往下节点指数增长),放摄像头从下往上放采用后序遍历。每个节点只有三种状态:0该节点未被摄像头监视;1该节点有摄像头;2该节点已被摄像头监视。null节点则相当于已经被监控状态为2。/** * Definition for a binary tree node. * pub原创 2022-03-13 00:36:10 · 1760 阅读 · 0 评论 -
leetcode113. 路径总和 II
给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。2.层序迭代跟求所有路径差不多。原创 2022-07-15 11:42:33 · 276 阅读 · 0 评论 -
leetcode257. 二叉树的所有路径
1.题目描述:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。2.回溯:3. 广度迭代:层序依次遍历节点,并记录每一条路线。......原创 2022-07-14 17:04:05 · 270 阅读 · 0 评论 -
leetcode222. 完全二叉树的节点个数
1.题目描述:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。2.层序遍历:3.递归:前序遍历:最优解: 4.借助完全二叉树的性质:见leetcode题解。...原创 2022-07-14 10:15:28 · 139 阅读 · 0 评论 -
leetcode559. N 叉树的最大深度
1.题目描述:给定一个N叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。2.递归:3.层序遍历:...原创 2022-07-13 11:54:04 · 131 阅读 · 0 评论 -
leetcode100. 相同的树
1.题目描述:给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。2. 递归:方法与leetcode101. 对称二叉树一致。3.迭代:方法与leetcode101. 对称二叉树一致。...原创 2022-07-13 10:51:24 · 204 阅读 · 0 评论 -
leetcode117. 填充每个节点的下一个右侧节点指针 II
1.题目描述:2.层序遍历:代码与leetcode116. 填充每个节点的下一个右侧节点指针一摸一样,这种解法与二叉树的形状无关。3.直接迭代:详见注释。原创 2022-07-09 23:18:53 · 121 阅读 · 0 评论 -
leetcode116. 填充每个节点的下一个右侧节点指针
1.题目描述:2. 层序遍历:3.直接迭代:根据上层next指针来实现,降低空间复杂度。原创 2022-07-09 21:05:30 · 112 阅读 · 0 评论 -
leetcode515. 在每个树行中找最大值
1.题目描述:给定一棵二叉树的根节点root,请找出该二叉树中每一层的最大值。2.层序遍历:3.递归,深度优先:原创 2022-07-09 16:04:34 · 122 阅读 · 0 评论 -
leetcode429. N 叉树的层序遍历
1.题目描述:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔(参见示例)。2.层序遍历:原创 2022-07-08 18:24:28 · 131 阅读 · 0 评论 -
leetcode199. 二叉树的右视图
1.题目描述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。2.层序遍历:也可普通的层序遍历结束之后对list集合进行操作得到右视图。3.递归,先访问右子树即可:...原创 2022-07-08 17:27:20 · 61 阅读 · 0 评论 -
leetcode107. 二叉树的层序遍历 II
1.题目描述:给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 2.层序遍历:普通层序遍历再将集合反转。或: 3.递归,深度优先:...原创 2022-07-08 15:14:09 · 180 阅读 · 0 评论 -
leetcode102. 二叉树的层序遍历
1.题目描述:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。2.层序遍历: 3.递归解法,深度优先:原创 2022-07-08 11:56:45 · 138 阅读 · 0 评论 -
leetcode538. 把二叉搜索树转换为累加树
1.题目描述:给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点node的新值等于原树中大于或等于node.val的值之和。2.中序遍历:首先中序遍历用集合记录所有节点的值,再通过中序遍历将每个节点的值更新,这种方法将集合排序后可适用所有二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2022-02-20 14:22:28 · 236 阅读 · 0 评论 -
leetcode108. 将有序数组转换为二叉搜索树
1.题目描述:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足每个节点的左右两个子树的高度差的绝对值不超过1的二叉树。2.递归:一个升序序列构建BST有多种,即使是以同一个节点为root节点的BST也有多种。结合BST中序遍历的升序特性,可以以升序序列中的任一个元素作为根节点,分割往左构建左子树,分割往右构建右子树即可得到二叉搜索树,本题要求高度平衡,选择升序序列的中间元素作为根节点即可,可以证明这种构建方法得到的必平衡。做原创 2022-02-19 18:14:19 · 174 阅读 · 0 评论 -
leetcode654. 最大二叉树
1.题目描述:给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。返回nums构建的最大二叉树。2.递归:本题思路与leetcode106. 从中序与后序遍历序列构造二叉树和leetcode105. 从前序与中序遍历序列构造二叉树类似,更加简单一些,代码如下:/** * Definition for a binary tr原创 2022-02-19 17:04:48 · 235 阅读 · 0 评论 -
leetcode105. 从前序与中序遍历序列构造二叉树
1.题目描述:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。2.递归:具体思路详见leetcode106. 从中序与后序遍历序列构造二叉树类似,只是找到前序遍历的首位元素来对中序遍历的数组进行分割,直接上代码:/** * Definition for a binary tree node. * public class TreeNode { * int val;原创 2022-02-19 15:53:51 · 419 阅读 · 0 评论 -
图解leetcode106. 从中序与后序遍历序列构造二叉树
1.题目描述:给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。2.拼凑的整体方法:原创 2022-02-19 13:01:12 · 457 阅读 · 0 评论 -
leetcode669. 修剪二叉搜索树
给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不应该改变保留在树中的元素的相对结构。可以证明,存在唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。和本题三者的递归都返回了处理完的当前root节点作为上级递归的左右子树,可以参考来看。...原创 2022-02-16 20:32:29 · 303 阅读 · 0 评论 -
leetcode450. 删除二叉搜索树中的节点
1.题目描述:给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。2.自己写的裹脚布代码:思路和插入操作leetcode701. 二叉搜索树中的插入操作差不多,二叉搜索树的删除节点较为复杂分三种情况:①删除叶子节点:直接删除。②删除只有一颗子树的节点:子承父业。③删除有两颗子树的节点:记录删除节点右子树的原创 2022-02-16 16:02:29 · 243 阅读 · 0 评论 -
leetcode701. 二叉搜索树中的插入操作
1.题目描述:给定二叉搜索树(BST)的根节点root和要插入树中的值value,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。2.改变原二叉搜索树结构的解法:首先,找到插入节点的父节点,也就是中序遍历最后一个小于插入值insNode的节点pre(前驱节点),插入有两种情况:①pre不存在右子树,则直接将插入节点置于其右节点。②pre存在右子树,pre.va原创 2022-02-15 22:37:24 · 337 阅读 · 0 评论 -
leetcode235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。不同,二叉搜索树的特性决定了最近公共祖先的大小必在p、q节点的最大值和最小值之间,并且是开区间,只需要采用前序遍历从上到下找到第一个满足条件的节点返回即可。代码逻辑其实也是从上到下从父节点开始找。...原创 2022-02-15 09:43:04 · 371 阅读 · 0 评论 -
leetcode236. 二叉树的最近公共祖先
1.题目描述:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。2.路径法(存储父节点信息):看完题目发现递归一下写不出,于是想找出p、q的遍历路径:5—>3,4—>2—>5—>3,找到这两条路径中首位相等的元素5即为最近公共祖先。关键在于如何得到该条路径并比较:借助哈希表来存储所有节点(除根节点)对应的父节点,原创 2022-02-14 20:54:40 · 243 阅读 · 0 评论 -
leetcode501. 二叉搜索树中的众数
1.题目描述:给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。2.中序遍历(递归):这道题目难点在于众数不止一个,刚开始写代码使用了哈希表来统计频次,但得到记录频次的哈希表,获取value排序后对应的key值较难。采用pre,count,maxCount,list集合来达到效果,pre是中序遍历前驱节点用来比较是否相等,count记录频次需要重置,maxCount记录是否最大频次,lis原创 2022-02-13 18:28:38 · 224 阅读 · 0 评论 -
leetcode530. 二叉搜索树的最小绝对差
1.题目描述:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值为绝对值。2.借助集合(任意二叉树成立):/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { .原创 2022-02-13 11:55:01 · 230 阅读 · 0 评论 -
leetcode98. 验证二叉搜索树
1.题目描述:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。2.递归:最初写的代码如下第一段,能发现存在问题,不能保证左子树中的所有节点值都小于当前节点,只是满足了左右子节点与当前节点的大小关系。于是想到通过获取当前root节点左子树节点的最大值max,和右子树节点的最小值min,满足max < root.val和min >原创 2022-02-12 20:56:58 · 337 阅读 · 0 评论 -
leetcode700. 二叉搜索树中的搜索
二叉搜索树/二叉查找树/二叉排序树左子树所有节点的值都小于当前节点,右子树所有节点的值都大于当前节点,且左右子树都是二叉搜索树。此题可利用二叉搜索树的特点,查找节点并返回该节点即可。给定二叉搜索树(BST)的根节点root和一个整数值val。你需要在BST中找到节点值等于val的节点。返回以该节点为根的子树。如果节点不存在,则返回null。...原创 2022-02-11 15:46:41 · 490 阅读 · 0 评论 -
leetcode94. 二叉树的中序遍历
1.题目描述:给定一个二叉树的根节点root,返回它的中序遍历。2.递归中序遍历:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tr.原创 2022-02-05 00:15:44 · 916 阅读 · 0 评论 -
leetcode145. 二叉树的后序遍历
1.题目描述:给你一棵二叉树的根节点root,返回其节点值的后序遍历。2.递归后序遍历:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2022-02-03 21:11:45 · 808 阅读 · 1 评论 -
leetcode144. 二叉树的前序遍历
1.题目描述:给你二叉树的根节点root,返回它节点值的前序遍历。2.递归前序遍历:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * T.原创 2022-02-03 18:26:04 · 364 阅读 · 0 评论 -
leetcode513.找树左下角的值
递归寻找到二叉树最底层最左边的节点,首先要找到最左边的节点可以采取前序遍历或者中序遍历,最底层则是找到二叉树的最大深度。遍历整颗二叉树递归中不需要有返回值,因此递归三步骤只剩下两步如下,判断当前节点是否为叶子节点,若是叶子节点则继续判断该节点是否为最大深处,借助变量deep1来实现。最后递归左右子节点。给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。root==null,直接return。......原创 2022-02-03 13:29:02 · 405 阅读 · 0 评论 -
leetcode637. 二叉树的层平均值
1.题目描述:给定一个非空二叉树的根节点root,以数组的形式返回每一层节点的平均值。与实际答案相差10-5以内的答案可以被接受。2.BFS层序遍历:看完题目毫不犹豫选择广度层序遍历,代码很容易写。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNod原创 2022-02-01 20:17:24 · 364 阅读 · 0 评论 -
leetcode671. 二叉树中第二小的节点
1.题目描述:给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为2或0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。更正式地说,即root.val = min(root.left.val, root.right.val)总成立。给出这样的一个二叉树,你需要输出所有节点第二小的值。如果第二小的值不存在的话,输出-1。2.递归+集合排序:递归遍历所有节点的值,存入集合中,再对集合排序取出第二小的节点,这种做法没有利用此题中节点的特殊性,代码易懂原创 2022-01-28 23:56:58 · 540 阅读 · 0 评论 -
leetcode337. 打家劫舍 III
1.题目描述:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。2.递归解法:这道题解题关键在于弄清楚最小化的计算逻辑。当前节点被抢,则左右子节点不能被抢,需要抢4个孙子节点获取最大钱数.原创 2022-01-26 16:47:09 · 161 阅读 · 0 评论 -
leetcode687. 最长同值路径
1.题目描述:给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。2.解这道题建议先看leetcode543. 二叉树的直径,有两种递归解法,自上而下,自下而上。自下而上(后序):不管路径是如何的,将路径想象为从当前节点root左右子节点延长的两条拼凑而成,首先通过递归获得左右子节点的val相同向下延长的最大值,这时需要判断当前root的val值是否与左右子节点的val值相同,若相同则路径.原创 2022-01-18 21:20:17 · 393 阅读 · 0 评论 -
leetcode404. 左叶子之和
1.题目描述:计算给定二叉树的所有左叶子之和。2.深搜递归:首先是计算所有叶子结点的和,这个较容易:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; .原创 2022-01-16 18:17:11 · 237 阅读 · 0 评论 -
leetcode111. 二叉树的最小深度
1.题目描述:给定一个二叉树,找出其最小深度,最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 2.BFS层级遍历(迭代):寻找最小深度,通过队列层级遍历,找到第一个节点不存在左右子节点即可。时间复杂度O(n),但是一旦找到直接return时间上会快一些,空间复杂度最差O(n)。二刷层序遍历:3.递归:跟求leetcode104. 二叉树的最大深度有所不同,在递归左右子节点之前,需要判断左右子节点是否为空,若左子节点为空,如果不判断的话在递归调用时会返回0,但是此时无法确定右子节点是否为原创 2022-01-16 12:37:24 · 173 阅读 · 0 评论 -
leetcode101. 对称二叉树
1.题目描述:给你一个二叉树的根节点root,检查它是否轴对称。2.翻转树的递归解法:自己在做这道题目的时候,发现递归第二步,每级递归需要做什么不好写,于是想反转右子树后再判断与左子树是否一致即可,翻转的题目正好做过leetcode226. 翻转二叉树。这种方法时间复杂度近似O(n),空间复杂度最差O(n)。直接看代码: 3.普通的递归解法:借助两次root,递归判断p左子树与q右子树是否镜像,p右子树与q左子树是否镜像。时间复杂度近似O(n),空间复杂度链表最差O(n),代码如下:4.在此基础原创 2022-01-15 21:11:22 · 171 阅读 · 0 评论 -
图解leetcode572. 另一棵树的子树
1.题目描述:给你两棵二叉树root和subRoot。检验root中是否包含和subRoot具有相同结构和节点值的子树。如果存在,返回true;否则,返回false。二叉树tree的一棵子树包括tree的某个节点和这个节点的所有后代节点。tree也可以看做它自身的一棵子树。2.递归:自己的想法比较简单,当前root节点若和subRoot节点值相等,则递归左右子节点判断,若不相等,则将传入root左右子节点递归判断,但是有几种情况会出现问题,比如传入[1,1],[1]。来回修改还是不能不外调方法解决,半成品代原创 2022-01-14 18:22:50 · 225 阅读 · 0 评论 -
leetcode437. 路径总和 III
1.题目描述:给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的 路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。2.递归:深度优先搜索,解这道题需要先会leetcode112. 路径总和,在112题目的基础上,这道题目增加了两个条件:①、统计路径之和相等的路径数目。②、路径不一定从根节点开始,叶子节点终止。首先第一个问题较容易解答,在判断路径时同时计数即可,同时在hasP原创 2022-01-13 17:47:36 · 262 阅读 · 0 评论