530.二叉搜索树的最小绝对差
题目链接/文章讲解: 代码随想录
代码随想录
题目 需要返回二叉树符合某一特性(boolean)或者返回二叉树里面某一个结点数值(int),或者遍历部分二叉树,沿着某一条方向,就需要返回值。本题需要遍历整颗二叉树,而且是用全局变量记录最小值,就不需要返回值。
代码
TreeNode pre = null;
int MinAbsolute = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
getMin(root);
return MinAbsolute;
}
public void getMin(TreeNode node){
if(node==null)return;
getMin(node.left);
if(pre!=null){
MinAbsolute = Math.min(MinAbsolute,Math.abs(node.val-pre.val));
}
pre=node;
getMin(node.right);
}
501.二叉搜索树中的众数
第一想法
根绝二叉搜索树,设置全局变量Map(key = 元素结点 ,value = 重复次数)。遍历将计算各节点的频次,将map集合按照降序排列,返回最大值。
代码随想录
有点像动态规划。如果频率值count等于maxCount,那么就加入结果集。
count大于maxCount,则以前的值失效,清空结果集,更新maxCount。
我第一次疑惑的点在于我想的是判断count大于等于maxCount,那么就加压入结果集(结构为堆),记录maxCount的数量,也就是众数的个数,弹出相对应数量的元素就行。这么做非常麻烦。
这个双指针妙的地方主要还是在思想,类似于动态规划的状态转移,并不等到全部遍历完才确定maxCount,而是每次遍历都确定目前已遍历序列的maxCount,因为下次遍历是在目前序列的基础上,所以下次maxCount的状态可以由目前转移过去,总的来说就是一个状态迭代的思想。 状态迭代的思想很关键,总是能确定局部最优解,在处理海量数据以及分布式数据时能实时给出局部最优结果,并且有较低的时间复杂度。
将ArrayLIst转换为数组: return result.stream().mapToInt(k->k).toArray();
代码
class Solution {
TreeNode pre = null;
int count=0,maxCount = 0;
ArrayList<Integer> result = new ArrayList<>();
public int[] findMode(TreeNode root) {
getMode(root);
return result.stream().mapToInt(k->k).toArray();
}
public void getMode(TreeNode root){
if(root==null)return;
//左结点
getMode(root.left);
//中结点,处理逻辑
if(pre==null)count=1;
else if (pre.val==root.val) {
count++;
}else{
count=1;
}
pre = root;
if(count==maxCount)result.add(root.val);
else if(count>maxCount){
maxCount = count;
result.clear();
result.add(root.val);
}
//右结点
getMode(root.right);
}
}
236.二叉树的最近公共祖先
代码随想录
此题从下往上遍历,参考求高度,所以选用后序遍历,根据左右结点值来处理中间节点。
最容易一个情况的公共节点:其左节点包含p或q,右结点包含p或q,那么这就是p或q的公共结点。
返回值和参数值都为TreeNode,因为题目要求我们返回公共节点,所以是有返回值的。
一旦有了返回值,左节点和右节点一定是有接收值的,不能立刻返回,要等左右逻辑处理完后才能返回。我们此时就需要遍历整棵树了。
left = 递归函数(root->left); // 左
right = 递归函数(root->right); // 右
left与right的逻辑处理; // 中
单层处理逻辑:
1. 左,右均为空,返回空
2. 左,右均不为空,那么一边一个,返回root
3. 左为空,返回右边
4. 右为空,返回左边。
代码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (root == p || root == q) return root;
TreeNode leftNode = lowestCommonAncestor(root.left, p, q);
TreeNode rightNode = lowestCommonAncestor(root.right, p, q);
if (leftNode == null && rightNode == null) return null;
else if (leftNode == null && rightNode != null) return rightNode;
else if (leftNode != null && rightNode == null) return leftNode;
else return root;
}
}