LeetCode 530.二叉搜索树的最小绝对差
思路:因为前提是搜索二叉树,即左子树小于根节点小于右子树,所以最小绝对差只会在左右孩子和根结点之间。虽然有思路,但在写递归代码的时候还是有些慌乱,还是题刷少了,最后看了题解才完整写出来的。代码如下:
class Solution {
TreeNode pre = null;
int min = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
transerval(root);
return min;
}
public void transerval(TreeNode node) {
if(node == null) return;
transerval(node.left);
if(pre != null) {
min = Math.min(min, Math.abs(pre.val - node.val));
}
pre = node;
transerval(node.right);
}
}
中序遍历得到的结果是有序的,node.val - pre.val就是大于0的,不需要再用绝对值函数了。
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。
LeetCode 501.二叉搜索树中的众数
思路:遍历一边二叉树,用map来统计每个元素出现的次数,记录下maxCount,最后再判断map中每个节点的值是否等于maxCount,等于就加入result中。
由于这道题中的二叉树是搜索二叉树,其中序遍历是有序的,可以通过一次遍历二叉树直接得到result。若当前count等于maxCount,则加入结果集中,若大于maxCount,则将result清空,说明之前的值都不满足条件。代码如下:
class Solution {
TreeNode pre = null;
int maxCount = 0;
int count = 0;
ArrayList<Integer> resultList;
public int[] findMode(TreeNode root) {
resultList = new ArrayList();
transerval(root);
int[] result = new int[resultList.size()];
for(int i=0; i<resultList.size(); i++){
result[i] = resultList.get(i);
}
return result;
}
public void transerval(TreeNode node) {
if(node == null) return;
transerval(node.left);
if(pre == null) { // 第一个节点
count = 1;
}else if(pre.val == node.val){ // 前一个节点等于当前节点
count++;
}else{ // 前一个节点不等于当前节点
count = 1;
}
if(count == maxCount){
resultList.add(node.val);
}
if(count > maxCount){
resultList.clear(); // 清空
maxCount = count;
resultList.add(node.val);
}
pre = node;
transerval(node.right);
}
}
LeetCode 236. 二叉树的最近公共祖先
思路:若能自底向上查找,便能找到公共祖先了。二叉树如何能自底向上查找呢?回溯,二叉树回溯的过程就是自底向上。后序遍历(左右中)便是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。
如何判断一个节点是节点q和节点p的公共祖先呢。
如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。
判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。
如果left 和 right都不为空,说明此时root就是最近公共节点。
如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
代码如下:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == p || root == q || root == null) return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if(left != null && right != null) return root;
if(left == null && right != null) return right;
return left;
}
}