21.合并两个有序链表 1、创建新的有序链表,使用dummy,而不使用ListNode* head = new ListNode的原因是可以省去析构。在栈上创建而不是在堆上创建。2、swap的难点在于交换的是变量的值还是变量的地址。我认为可以理解为将两个变量的名称互换了,这里的意思是值小的叫list1。3、最后如果list1先结束就把list2剩余的接上,反之亦然。
863.二叉树中所有距离为K的节点 本题和二叉树关系也不大,关键是二叉树如何转化为无向图,与无向图的广度有限遍历的应用。2.进行广度优先遍历,将深度为2的所有元素push到ans中。1.将二叉树转化为无向图。
823. 带因子的二叉树 arr[i]作为根节点A, arr[j]作为其中的一个叶子节点B,arr[i] / arr[j]作为另一个叶子节点C。该根节点可以组成的二叉树的个数为B和C的子树的乘积。最后 遍历哈希表中每个根节点可以组成的二叉树的和就是最终答案。本题的主要思路,将数据从小到大依次作为二叉树的节点,算出每个数据作为节点的二叉树个数。有用题目中说明,数据量可能过大,所以除以kMod保证结果始终在int的范围内。本题虽是二叉树问题但和二叉树没太大关系,我认为关键是对哈希表的应用。
480.滑动窗口中位数 static_cast,一般来说,编译器隐式执行的任何类型转换都可以由static_cast显式完成。在转前一定确定好目标类型数据。1、multiset的使用。2、迭代器相关知识。
239.滑动窗口最大值 这里erase操作会将与该值相等的所有元素删除,但我们希望只删除第一个。multiset中equal_range是使用二分法查找的。使用单调队列,队列从头到尾异地递减,新加入的元素如果大于队尾元素则将队尾元素删除,直至队列中没有比新加进来的元素大。multiset 的使用,meltiset中可以包含重复重复的值,并且插入进去后直接排好序。
297. 二叉树的序列化与反序列化 二叉树存储方式是随机存储,在发从以二叉树存储的数据信号时不方便,通常将其按一定方式转为序列存储,然后接收放将序列再次反序列化以二叉树方式存储。标准库:ostringstream istringstream stoi(将字符转换为数值)数据流存储时一个字符中间隔一个空格,在数据流读取时自动隔一个空格读取。二叉树的序列化与反序列化,即二叉树的遍历与构造。
98. 验证二叉搜索树 自己写的适合也考虑到用中序遍历,但是对中序遍历的方式还不带熟悉,没有引入prev_这个变量,引入prev_后程序变得简洁了许多。搜索二叉树性质,中序遍历是元素是有序的且是由小到大。
124. 二叉树中的最大路径和 1、二叉树的路径,被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。2、当子树中最大路径是负数时,就为0。1、本题和687. 最长同值路径相似,或者说几乎一样。
687. 最长同值路径 1、二叉树的路径,被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。1、本题我在思考是觉得麻烦的地方在需要将所有候选路径的结果存在vector中,然后还需排序取最大值,而花花酱有个非常好的处理方式就是通过引用实时跟新最大值,这个方法值得学习。该程序设计非常巧妙,将递归方法运用的炉火纯青。
1110. 删点成林 对于空间和时间开销的话递归方法要差点,递归次数受栈大小限制,函数调用和压栈出栈都需要时间。而循环就没什么空间和时间上额外的开销。1、递归的使用条件,某个大问题可以分化为多个同样的小问题(最经典的使用场景就是二叉树的遍历)在二叉树中会经常根据不同的需求用到递归的操作。看其他网友的回答,递归更易读,循环比较复杂,我觉得也看情况吧。2、递归的返回条件,返回条件可以有多个,按希望得到的结果设置条件。有个简单的道理,太复杂的用递归,要不循环不但程序成而且难看懂。比较小的问题就用循环,不但代码简单而且也容易看懂。
1305 两棵二叉搜索树中的所有元素 1、二叉搜索树的性质,二叉搜索树又称二叉排序数或二叉查找树。一棵二叉搜索树可以为空,如果不为空,应满足一下性质:(1)非空左子树的所有键值小于其根节点的键值。(2)非空右子树的所有键值大于其根节点的键值。(3)左右子树都是二叉搜索树。