530.二叉搜索树的最小绝对差
因为是二叉搜索树,仍然用到中序遍历得到升序数组。
利用双指针得到差值
501.二叉搜索树中的众数
如果不是二叉搜索树
- 这个树都遍历了,用map统计频率
- 把统计的出来的出现频率(即map中的value)排个序
把map转化数组即vector,再进行排序,当然vector里面放的也是pair<int, int>类型的数据,第一个int为元素,第二个int为出现频率。 - 取前面高频的元素
是二叉搜索树
既然是搜索树,它中序遍历就是有序的
遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。
** 双指针法**:弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
** 只需要遍历一次就可以找到所有的众数。**
- 如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中
- 频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了
递归法同之前,迭代法套中序模板
236.二叉树的最近公共祖先
遇到这个题目首先想的是要是能自底向上查找就好了,这样就可以找到公共祖先了。
二叉树回溯的过程就是从低到上
后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。
-
情况1:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先
-
情况2:就是节点本身p(q),它拥有一个子孙节点q§
但实际情况1包含了情况2:因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本省就是 公共祖先的情况。
完整流程:
总结:
- 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。
- 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。
- 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。