![](https://img-blog.csdnimg.cn/59e8a7d0c6404ceaba945df42e924f18.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
每日一题
文章平均质量分 59
坚持每天做一道算法题,每天一小步,积跬步以致千里,冲刺竞赛和笔试。
我不是小明同学
努力奔跑才能与幸运不期而遇
展开
-
每日一题~组合总数III
如果我们在寻找组合的时候,就进行剪枝,只保存升序的列表例如,【1,2,3】,【1,2,4】,【1,2,5】,……1、准备一个 tmp 列表保存当前集合的数据,用 list 列表保存所有符合条件的列表,用 sum 来记录当前 tmp 列表中的数据之和,用一个 used 数组来记录该数据是否已经被使用。这是一个组合的问题,所以我们可以使用深度优先搜索(DFS)的方式将所有的情况都列举出来,然后将其中符合条件的情况添加到列表中,最后返回这个列表就可以了。原创 2023-09-25 10:07:31 · 119 阅读 · 0 评论 -
每日一题~将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。原创 2023-09-23 15:31:21 · 58 阅读 · 0 评论 -
每日一题~修剪二叉树
由题可知,我们要将原来的二叉搜索树调整为值在 low~high 之间的新二叉搜索树,接下来我们分析一下针对不同的节点的处理方式。2、val > high,这种情况说明 root 的右子树全部大于 high,我们这时候只需要到左子树中再进行修剪即可。1、val < low,这种情况说明 root 的左子树全部小于 low,我们只需要到右子树中再进行修剪就可以了。原创 2023-09-22 16:11:48 · 173 阅读 · 0 评论 -
每日一题~删除二叉搜索树中的节点
我们可以看到删除掉目标节点之后,父节点指向了右子树,右子树的节点指向了左子树,看似简单的调整。由题可知,这是一个二叉搜索树,我们删除掉一个节点之后,需要重新调整树,使其仍然是二叉搜索树,那么我们接下来分析一下有多少中删除的情况。3、删除节点的左子树和右子树都不为空,和题目中所给的例子相同,题目中给了两种结果,我们都分析一下。4、删除节点的左右子树都为空时,这种情况在左右子树都存在的情况下已经得到了解决,2、删除节点的右子树为空,当右子树为空的时候,情况和左子树相似,我们直接让。原创 2023-09-21 18:53:05 · 150 阅读 · 0 评论 -
每日一题~二叉搜索树中的插入操作
由第一步可以知道,我们是从 root 节点开始向下找,所以当 root = null 时,说明我们已经找到了那个位置,这时候我们直接返回到上一个节点,如果此时 root.left == null && root.val > val,那么直接将 val 添加到 root.left 就可以,由题可知,题目的要求是给我们一个二叉搜索树和一个 val,将这个 val 插入到二叉搜索树中,并且这个树仍然是二叉搜索树。第二种是,将 val 替换掉已经存在的节点,然后重新调整树。原创 2023-09-20 12:03:06 · 166 阅读 · 0 评论 -
每日一题~二叉树的最近公共祖先
由题可知,我们需要找到 p 和 q 两个二叉树的最近公共祖先节点,首先我们分析一下,这个最近公共祖先节点的可能情况。1、这个最近公共祖先节点既不是 p 也不是 q,简单来说,p 和 q 一个是某个节点的左子树,另一个是该节点的右子树,也就是示例一的情况。2、这个最近公共祖先节点是 p 或者 q,也就是说,p 是 q 的父节点或者 q 是 p 的父节点,也就是示例二的情况。如果说只有找到了一个树,那么说明另一个树是这个树的子树,则直接返回找到的那个结点就可以,原因可以看下面的图片。原创 2023-09-19 17:36:55 · 58 阅读 · 0 评论 -
每日一题~二叉搜索树中的众数
那么我们可以根据这一特性来获取到二叉搜索树中的所有 val,放在一个 List 中,并且这个 List 是有序的。获取到二叉搜索树中的所有 val 之后,我们接下来就可以寻找众数。我们使用 max 来记录 List 中众数出现的次数,使用 Map 来保存 val 及其出现的次数,这样在后面我们就可以直接从 Map 中获取到 val 出现的次数。,我们再使用一个 ArrayList 来存放众数,将所有的众数都存放到 ArrayList 之后,我们再将 ArraryList 中的数据拷贝到数组中就可以了。原创 2023-09-18 20:09:34 · 108 阅读 · 0 评论 -
每日一题~合并二叉树
由图可知,当两个位置都有节点的时候,直接将两个节点的 val 相加就是结果,如果在一个位置两棵树只有一棵在此位置上有节点,那么这个节点就是合并之后的结果。因此在合并二叉树的过程我们只需要做两步就可以了。原创 2023-09-16 20:39:28 · 115 阅读 · 0 评论 -
每日一题~二叉树中的搜索
我们可以利用二叉树的性质来解决这道题,例子中所给的 val 是 2,2 小于 root.val,所以我们接下来再左子树中寻找符合条件的子树即可,如果说,val 大于 root.val 的话,那我们只需要在右子树中去寻找目标子树就可以了。注意如果 root 等于 null,说明树为空,或者我们已经找到底了,这时候直接返回 null 就行了。其特点如下:设 x 为二叉查找树中的一个结点,x 节点包含关键字 val,简单来说就是左孩子比父节点小,右孩子比父节点大,还有一个特性就是”中序遍历“可以让结点有序。原创 2023-09-17 20:23:56 · 72 阅读 · 0 评论 -
每日一题~最大二叉树
2. 根据根节点的 index 划分数组,我们约定保存 val 和 index 的数组名为 indexVals,indexVals[0] 是 val,indexVals[1] 是 index,beg 是数组的开始,end 是数组的结尾,那么左子树部分就是 beg~indexVals[1]-1,右子树的部分就是 indexVals[1]+1~end。我们可以写一个方法,它的返回值可以是一个数组,这样我们就可以一次获得数组中的最大值及其下标,将所得的最大值保存在根节点中。给定一个不重复的整数数组。原创 2023-09-15 08:41:37 · 138 阅读 · 0 评论 -
每日一题~中序后序遍历构造二叉树
第一个节点比较容易找到,但是其他的节点就没有那么容易,因此我们准备了一个 index 用来记录找到了多少个节点,这样在找后面的节点的时候我们只需要找postorder[postorder.length-1-index] 就可以了。不难看出后序遍历的结果中的最后一个元素就是根节点,倒数第二个元素则是根节点的右子树的根节点,而倒数第三个元素则是右子树的新右子树的根节点,依次类推。3. 构建右子树,左子树,必须要先构建右子树,因为 postorder 从后往前的顺序就是右子树在先,左子树在后。原创 2023-09-13 12:10:32 · 173 阅读 · 0 评论 -
每日一题~前序中序遍历构造二叉树
接下来我们再分析一下右子树里面的数据,通过观察可以发现,在右子树的根节点左侧的数据是右子树的左子树,在右子树的根节点右侧的数据则是右子树的右子树,与整颗二叉树的分布规律相同。2、在中序遍历中找到根节点的位置 rootIndex,然后根据根节点的位置将中序遍历数组分为左子树部分和右子树部分,也就是。如上图所示,我们发现 ①号就是前序遍历结果的第一个数据,同时它也是二叉树的。,接下来我们再看 ③号,③号在前序遍历结果中在②号的后面,而且是根节点的。,②号是前序遍历结果的第二个数据,同时它还是根节点的。原创 2023-09-14 12:53:13 · 170 阅读 · 0 评论