530.二叉搜索树的最小绝对差
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
本题解法仍然是中序遍历,并且在遍历时找出最小绝对值差
class Solution {
// 定义一个最大值
int result = Integer.MAX_VALUE;
TreeNode pre;
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);
}
}
501.二叉搜索树中的众数
501. 二叉搜索树中的众数 - 力扣(LeetCode)
本题仍然采用中序遍历,并且定义一个pre指针,因为是二叉搜索树,所以中序遍历后相同的节点都是相邻的。这里定义count记录单个value的次数,maxCount记录最大的次数,遍历时如果value和pre的相同,那么count++,并且和maxCount比较,如果相等,那么在结果数组中加入该value,如果大于maxCount,那么将结果数组清空,加入新的value
class Solution {
List<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[] resInt = new int[resList.size()];
for (int i=0; i<resList.size(); i++) {
resInt[i] = resList.get(i);
}
return resInt;
}
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);
}
}
236. 二叉树的最近公共祖先
236. 二叉树的最近公共祖先 - 力扣(LeetCode)
本题使用后序遍历,只要找到p或q就向上返回,直到同一个节点下有p和q两个子树
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) {
return root;
}
// 如果不为空,则代表含有p或q
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if (left == null && right == null) {
return null;
} else if (left == null && right != null) {
return right;
} else if (left != null && right == null) {
return left;
} else {
return root;
}
}
}