树
写code不咋行
这个作者很懒,什么都没留下…
展开
-
关于树相关题目的算法技巧总结(常更新)
一、数据结构- - 树de 特点(本文以二叉树的相关题目为重点)树整体分为二叉树与N叉树,二叉树题目即是N叉树题目的特殊情况,整体解决思路是一致的,区别在于对于当前结点的子结点的描述不同,因为二叉树仅分左右,而N叉树的情况是考虑其所有孩子(int v : node.children)。树的一个重要特点就是具有递归性,所以拿到数的相关题目时,就要首先考虑递归,然后结合所涉及题目具体的要求,往流程中间添加其他步骤。我们可以设计一个二叉树解题框架 ,二叉树中的框架思维十分明显,而且大部分算法技巧,其实原创 2020-08-31 20:08:30 · 363 阅读 · 0 评论 -
从根到叶的二进制数之和(1022)
题目: 给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。以 10^9 + 7 为模,返回这些数字之和。示例:思路分析:一、本题需要得到从根到叶的结点值所组成的二进制数,如何得到,这一步解题思路可以参考二叉树的所有路径,当我们知道如何构造一条原创 2020-08-31 11:34:31 · 388 阅读 · 0 评论 -
单值二叉树(965)
题目: 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例:1.2.思路分析:1.当拿到关于树的题目时,首先想到的就是递归和遍历,将树的前后节点进行比对,一旦有不等者,直接返回false,此方法下我建立了一个list,将遍历所得结点放入list,进行前后比较。Code — 1class Soultion { List<Integer> list = new LinkedList<>(原创 2020-08-30 16:16:27 · 132 阅读 · 0 评论 -
二叉搜索树的范围和(938)
题目: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。二叉搜索树保证具有唯一的值。示例:思路分析:一、按照题目所给为BST,首先想到的是按照遍历,将其所有结点全遍历进列表之中,然后上一个循环来将列表中的所有值循环一遍,写完之后,我发现这是个笨办法,因为提交了以后就超过时间限制了,所以就要想办法,精简程序。二、依旧是遍历每个结点,在遍历中就将符合范围内的结点加入求和变量之中。三、直接分大方向,当根节点值小于左范围时,直接进入右子树进行判断,可以节省在另左子树上浪原创 2020-08-30 15:04:33 · 133 阅读 · 0 评论 -
递增顺序查找树(897)
题目: 给一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。示例:输入:输出:思路分析:一、大思路就是先中序遍历获得一个升序列表,然后将所获列表转换成题目所要求形式的二叉树。二、在主函数中通过循环得到一棵树,具体解析在代码中。算法复杂度分析:1.时间复杂度O(N):需要遍历树的所有结点且只遍历一次。2.空间复杂度O(N):递归调用栈辅助空间。Codeclass Solution { List<Integer>原创 2020-08-29 17:17:48 · 146 阅读 · 0 评论 -
叶子相似的树(872)
题目: 请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。示例:思路分析:1.题中之意是分别获取两棵不同的树的叶节点,然后比较两组叶节点的大小顺序是否完全一致。2.故要做的工作只有两步,首先获取叶节点,其次进行比较即可。3.主函数中一个巧妙的地方在于先简单的判断一下两个列表的长度大小是否相等,否则可以直接返回false即可。算法复杂度分析:1.时间复杂度:O(N),需要遍历两棵树树的所有结点且只遍历一次。2.空间复杂度:O(N),递归调用辅助栈空间。Co原创 2020-08-29 15:09:00 · 107 阅读 · 0 评论 -
二叉搜索树结点最小距离(783)
题目: 给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。示例:思路分析:一、题中给定了BST,故由BST树的特性可知对其进行中序遍历可以得到一个升序数列。二、而最小值必定出现在升序数列中前后无缝衔接的两数之间,不可能跨数取得最小值,故将两树相减后的值存入新数列之中,最后结果进行返回即可。Codeclass Solution { List<Integer> list = new LinkedList<>(); List<Integer>原创 2020-08-29 11:13:26 · 104 阅读 · 0 评论 -
二叉搜索树中的搜索(700)
题目: 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。示例:当给定树和值时:应当返回如下所示:思路分析:1.当题目给定二叉搜索树时,就要想到BST宝宝结点左小右大的特性,利用这个特性进行题目求解。2.将给定值同根结点值大小进行判断,如果大于则去左子树,如果小于则去右子树,如果等于,直接返回当前树。Code-递归:class Solution { public TreeNode searc原创 2020-08-29 10:35:26 · 170 阅读 · 0 评论 -
最长同值路径(687)
题目: 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。示例:1.2.思路分析:一、最长同值路径分为两种情况1.1 以root为起点,经过左子树或右子树,如上图(2)所示。1.2 不是以root为起点,root是中间点,如上图(1)所示。二、但是如果我们设计的递归函数helper,递归计算以每一个节点为起点的最长同值路径(只计算了情况1的结果),如下所示:ps:橘色数字代表以该结点为原创 2020-08-28 20:59:49 · 219 阅读 · 0 评论 -
二叉树中第二小的结点(671)
题目: 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。 给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。示例:1.2.思路分析–递归1一般关于二叉树的题首先考虑递归,简单方便。2.有关第二小的数字,我们可以定义两个变量分别用来存放第一小数字first和第二小数字second。3.定义一个count计数器,当能记到第二小的数字时,说明出原创 2020-08-27 21:36:18 · 151 阅读 · 0 评论 -
修剪二叉搜索树(669)
题目: 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点示例:1.2.思路分析一、题中给出的是 BST(二叉搜索树) ,其特点是给定当前结点,其左宝宝小于该结点,右宝宝大于该结点。利用该特点就可以进行分情况讨论二、从根结点开始修剪:2.1如果根结点的值小于给定的L,那么该结点的左子树的所有结点值只会比L更小,所以直接返回右子树进行递归判断即原创 2020-08-27 17:08:37 · 98 阅读 · 0 评论 -
两树之和IV-输入BST(653)
题目: 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。示例:1.2.思路分析一----HashSet通过dfs遍历树的每个结点,查询哈希表内是否有与当前结点值加和后为目标值的元素,如果有,直接返回true,如果没有将当前值加入哈希set中,接着遍历该结点的宝宝结点进行递归查询。算法复杂度分析:1.时间复杂度:O(N),最坏情况下,需要遍历全树所有结点。2.空间复杂度:O(N),最坏情况下,HashSet空间复杂度为O(N),递原创 2020-08-27 11:21:49 · 138 阅读 · 0 评论 -
二叉树的层平均值(637)
题目: 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例: 思路分析一、由题目知,要求层平均值,故需要对二叉树进行层次遍历,以及队列的使用。二、要得到最后结果,考虑需要用到的变量等,需要一个变量sum盛装某曾所有结点值之和;需要一个变量count记录某曾所有结点个数等。三、借助队列实现二叉树的层次遍历:1.初始化一个队列,将根结点入列;2.根据队列的size实现本层的遍历;3.每次出队一个结点,记录当前结点的值(融入sum),而后将该结点的左右宝宝入队;4.将2、3循环执行,原创 2020-08-26 16:42:28 · 152 阅读 · 0 评论 -
合并二叉树(617)
题目: 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例:思路分析–递归一、合并两棵树时,其中不但涉及到结点的更新,也涉及到链接的更新,最简便的方法就是选定一棵主树,让另外一棵树归并到主树上。二、递归的下沉阶段在两棵树中不断搜索,上浮阶段不断更新结点左右子链接,然后更新结点的值。三、递归放回值为更新完成的原创 2020-08-26 15:05:36 · 146 阅读 · 0 评论 -
根据二叉树创建字符串(606)
题目: 需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。 空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例:1.2.思路分析:一、从题目中可以获取重点信息,在前序遍历中,如果当前结点为父结点的右宝宝,且其父结点的左宝宝为null时,关于左宝宝的括号是不能省略的,而左宝宝存在但右宝宝不存在或是左宝宝和右宝宝都不存在时,可以直接略过,对于该父结点直接进行闭括号,故,基于这一特殊情况,我们需要专门建立一个结点变量原创 2020-08-26 11:11:44 · 136 阅读 · 0 评论 -
N叉树的后序遍历(590)
题目: 给定一个 N 叉树,返回其节点值的后序遍历。示例:思路–迭代:1.迭代方法中必定会涉及一个大循环,同时有必要借助栈,简便方法即借助一个栈即可完成目标任务。2.分析 栈 在此题中的用法:以上图为例,1先进栈,然后出栈,遍历该结点的子结点为3、2、4,然后按照栈的特点,先进后出,则4先出,然后遍历其宝宝结点,若宝宝结点还有宝宝结点,则继续向下一层遍历(原理同于由1向3、2、4迭代)。直接将值加入res正好是相反的顺序,故需要进行翻转,或是在把stack中pop出来的值直接addFirst加入r原创 2020-08-25 10:31:35 · 120 阅读 · 0 评论 -
N叉树的前序遍历(589)
题目: 给定一个 N 叉树,返回其节点值的前序遍历。示例: 思路分析-迭代:一、总的思想即是在处理完某个结点后,如何快速准确处理其左边第一个宝宝结点。二、可以考虑层序遍历,层序遍历会借助队列,初始时刻根节点入列,此后如果队列非空,就出列一个结点,并将其子结点从左到右依次入列,但是这种方式下每次从队首出列的结点可能是某个结点的左宝宝,也有可能是某个结点的右宝宝(看上文一、中加粗斜线)。此时距离前序遍历还差距离,此时看一下队尾,如果结点每次都从队尾出列,然后再将子结点从左到右入列,我们可以得到 根→右→原创 2020-08-24 10:36:19 · 138 阅读 · 0 评论 -
另一个树的子树(572)
题目: 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例:示例1-示例2-思路分析:一、题中所给s中是否包含t,意思是问s中是否存在一棵子树与t完全相同(包括树的结构完全一致以及每个结点值都相等)。二、辅助函数中:如何判断两棵树是否完全相同,需要引入辅助函数isSameTree(TreeNode p, TreeNode q)进行判断,可以参考100.相同的树的思原创 2020-08-21 10:29:44 · 105 阅读 · 0 评论 -
二叉树的坡度(563)
题目: 给定一个二叉树,计算整个树的坡度。名词解释:1.一个树的某结点的坡度:该结点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。2.整个树的坡度:全树所有结点坡度之和。示例:思路分析:一、计算整棵树的坡度之和,则我们可以涉及递归函数计算每个结点的坡度1.首先,计算每个结点的坡度,就要先计算该结点的左子树结点之和和右子树结点之和。2.左子树结点之和 = 左子树根节点值 + 左子树的左子树的结点之和 + 左子树的右子树的结点之和。3.继续递归分解下去,直到分解到空树,空原创 2020-08-19 16:18:24 · 252 阅读 · 0 评论 -
N叉树的最大深度(559)
题目: 给定一个 N 叉树,找到其最大深度。相关名词解释:1.最大深度是指从根节点到最远叶子节点的最长路径上的 节点总数 。示例:思路分析:一、参考 二叉树最大深度 的题解,故N叉树的最大题解是关于树问题的一个通解,其本质都相同,即普遍形式。二、本题我的解是按照BFS迭代的方式进行求解,按照层次遍历,逐层迭代。Code-BFS迭代:class Solution { public int maxDeoth(Node root) { if (root == null) { retu原创 2020-08-19 10:44:24 · 143 阅读 · 0 评论 -
二叉树的直径(543)
题目: 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。题目中涉及概念解析:1.二叉树的直径长度: 一棵二叉树的直径长度是任意两个结点路径长度中的最大值。2.路径长度定义 :两结点之间的路径长度 = 该两结点之间边的数目。思路分析:一、根据题目可以直观想到将根结点的左右子树的最大深度相加即可,但是可以考虑一个特殊例子,如:某二叉树,其左子树为一个高度100的平衡二叉树,而右子树为空,故正确想法应该是每一个结点到达其左原创 2020-08-17 17:03:03 · 177 阅读 · 0 评论 -
把二叉搜索树转换为累加树(538)
题目: 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。示例:思路:1.根据题意可知输出结果应为:13=13+(0)5=5+(13+0)2=2+(5+13+0)2.由1等号左侧可知产生了降序序列,利用BST中序遍历(左->根->右)得到升序数组的特性,可以使用反中序遍历(右->根->左),然后进行遍历直接可得到一棵新树。算法复杂度分析1.时间复杂度原创 2020-08-16 17:45:22 · 62 阅读 · 0 评论 -
二叉搜索树的最小绝对差(530)
**题目:**给定一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:思路:一、题目给定一棵BST,故对其进行中序遍历即可得到一个升序序列,利用BST的特性,进行遍历计算即可。需要一个整数类型 res 记录最小绝对差,同时需要 pre 来记录前移结点值进行数学运算。二、中序遍历流程中1.首先判断结点root == null 之间的关系,若为空,则直接返回。2.进而进行中序遍历,即一直寻找结点的左宝宝,直到找到最左边的宝宝后开始进行数学运算,即进入if作出判断。原创 2020-08-16 11:46:52 · 150 阅读 · 0 评论 -
二叉搜索树中的众数(501)
题目: 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。原创 2020-08-15 17:50:33 · 92 阅读 · 0 评论 -
左叶子之和(404)
题目: 计算给定二叉树的所有左叶子之和示例:思路分析–递归:1.遍历二叉树,每次对根结点进行判断其是否有左叶子结点即可。2.遍历方法可以采用前序 / 中序 /后序 /层次遍历。3.算法步骤的关键点在于如何判断一个结点是否为左叶子结点,在确定该结点既无左子结点,亦无右子结点时,可以确定该结点为叶子结点,但无法确定该结点是否为左叶子结点,此时就要通过该结点的父结点进行确定性判断,该父结点不为空,且父结点的左孩子(即上文提到的该结点)不为空,且左孩子的左孩子与右孩子皆为空,故该结点为左叶子结点。C原创 2020-08-14 10:57:15 · 101 阅读 · 0 评论 -
二叉树的所有路径(257)
题目: 给定一棵二叉树,返回所有根节点到叶子结点的路径。思路分析:(1)从树的根结点开始遍历二叉树,判断该结点是否是非空结点,若不是,加入路径,继续向下判断是否是叶子结点。(2)判断该结点是否是叶子结点,如果是叶子结点,说明已经得到一条完整路径,则将该路径加入路径集合;若不是叶子结点,则继续向下判断,递归其左右子树继续构建该路径。算法复杂度分析:(1)时间复杂度:整个流程需遍历二叉树的每一结点且只遍历一次,故时间复杂度为O(N)。(2)空间复杂度:递归需要使用栈辅助空间,故空间复杂度为O(N)。原创 2020-08-13 19:05:29 · 193 阅读 · 0 评论 -
二叉搜索树的最近公共祖先(235)
题目: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。名词解释:最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。示例:思路—递归:根据题意可以得知,要求从根节点为root的树返回p、q的最近公共祖先,使用递归方法,如果p、q均小于root,则应该由root的左子树返回p、q的最近公共祖先;如果p、q均大于root,则应该从root的右子树返回p、q的最近公共原创 2020-08-13 11:37:33 · 137 阅读 · 0 评论 -
翻转二叉树(226)
题目: 翻转一棵二叉树。举例:思路1-递归:使用递归方法进行解题,原创 2020-08-11 16:44:42 · 125 阅读 · 0 评论 -
路径总和(112)
题目: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。相关名词解释:叶子结点:指没有左右宝宝的结点举例:思路: 本题判断 是否存在 从根结点root到叶子结点的结点值之和为给定的sum。则可以转换为求解从root.left 或 root.right 开始到叶子结点是否有满足结点值相加满足sum-roo.val的路径,即 hasPathSum(root.left,sum-root.val) || hasPathSum(root.right原创 2020-08-11 10:25:55 · 106 阅读 · 0 评论 -
二叉树的最小深度(111)
题目: 给定一个二叉树找出其最小深度概念解析:(1)最小深度是指从根节点到最近叶子结点的最短路径上的结点数量。(2)叶子结点是指没有左宝宝也没有右宝宝的节点。思路:一个特例要弄清楚,例如[3, 9],通过该特例弄明白题意1.明确叶子结点的概念,即该结点无左宝宝亦无右宝宝,故在特例中3并不是叶子结点,9才是叶子结点。题目中问根节点到叶子结点的最远距离,故该特例中定不是以1为结果。2.弄明白递归结束条件(1)若root为空时,直接返回0。(2)若root的左右孩子都为空时,则root就是一个叶原创 2020-08-10 20:01:17 · 155 阅读 · 0 评论 -
判断一棵二叉树是否是高度平衡二叉树(110)
题目: 给定一棵二叉树,判断是否是高度平衡的二叉树概念简介:一棵高度平衡的二叉树是指一棵树的任一节点的左右两棵子树的高度差的绝对值不超过1。思路:本题因能力有限,暂时考虑使用 暴力法 进行求解,即采用 从顶至下 的方法。整体思路是刻画一个获取当前节点最大高度的方法depth(root),然后通过比较该子树的左右子树的最大高度差abs(depth(root.left) - depth(root.right)) 是否小于1来判断此子树是否是二叉平衡树。当这棵树的所有子树都为二叉平衡树时,该树为二叉平衡树原创 2020-08-10 11:53:04 · 333 阅读 · 0 评论 -
将有序数组转化为平衡二叉树(108)
题目: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。给定有序数组: [-10,-3,0,5,9]。概念详解1.高度平衡二叉搜索树(AVL树)(1)左子树与右子树的高度之差的绝对值不超过1。(2)整棵树中的每棵左子树与右子树都是AVL树。(3)每个节点都有一个平衡因子(balance factor–bf),任一节点的平衡因子是-1/0/1。(每个节点的平衡因子等于右子树的高度减去左子树的高度 )2.AVL树的效率一棵AVL树有N个节点,其高度可以保持在log2N,插入/删除/查找原创 2020-08-09 17:55:10 · 1041 阅读 · 0 评论