236. 二叉树的最近公共祖先
递归三部曲:
1、确定参数和返回值:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
2、确定中止条件:
if (root == null || root == p || root == q) { // 递归结束条件
return root;
}
3、确定单层递归的逻辑:
后序遍历:
TreeNode left = lowestCommenancester(root.left, p, q);
TreeNode right = lowestCommenancester(root.left, p, q);
// 根据左子树和右子树的查找结果,决定返回什么
if (left == null && right == null) {
return null; // 左右子树都没找到 p 或 q,返回 null
} else if (left == null && right != null) {
return right; // 右子树找到了,返回右子树的结果
} else if (left != null && right == null) {
return left; // 左子树找到了,返回左子树的结果
} else {
return root; // 左右子树都找到了,当前节点是最近公共祖先
}
501. 二叉搜索树中的众数
二叉搜索树的中序遍历是有序的。
class Solution {
ArrayList<Integer> resList;
int maxCount;
int count;
TreeNode pre;
public int[] findMode(TreeNode root) {
resList = new ArrayList<>();
maxCount = 0;
count = 0;
pre = null;
findMode1(root);
int[] res = new int[resList.size()];
for (int i = 0; i < resList.size(); i++) {
res[i] = resList.get(i);
}
return res;
}
public void findMode1(TreeNode root) {
if (root == null) {
return;
}
findMode1(root.left);
int rootValue = root.val;
// 计数
if (pre == null || rootValue != pre.val) {
count = 1;
} else {
count++;
}
// 更新结果以及maxCount
if (count > maxCount) {
resList.clear();
resList.add(rootValue);
maxCount = count;
} else if (count == maxCount) {
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
}
}
530.二叉搜索树的最小绝对差
二叉搜索树是有序的。将二叉树转换成有序数组来算。
class Solution {
TreeNode pre;
int result = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if(root == null) return 0;
traversal(root);
return result;
}
public void traversal(TreeNode root){
if(root == null) return;
//左
traversal(root.left);
//中
if(pre != null){
result = Math.min(result, root.val - pre.val);
}
pre = root;
//右
traversal(root.right);
}
}