LeetCode530 二叉搜索树的最小绝对差
public class code530 {
TreeNode preNode = null;
int minDiff = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if (root == null) return 0;
transfer(root);
return minDiff;
}
private void transfer(TreeNode root) {
if (root == null) {
return;
}
// 左
transfer(root.left);
// 中
if (preNode != null) {
minDiff = Math.min(minDiff, root.val - preNode.val);
}
preNode = root;
// 右
transfer(root.right);
}
}
依然是中序遍历加双指针的思想
LeetCode501 二叉搜索树中的众数
public class code501 {
TreeNode preNode;
int count;
int maxCount;
List<Integer> res;
public int[] findMode(TreeNode root) {
preNode = null;
count = 0;
maxCount = 0;
res = new ArrayList<>();
transfer(root);
int[] resList = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
resList[i] = res.get(i);
}
return resList;
}
private void transfer(TreeNode root) {
if (root == null) {
return;
}
// 左
transfer(root.left);
// 计算当前遍历节点的数量
if (preNode == null) {
count = 1;
} else if (preNode.val == root.val) {
count++;
} else {
count = 1;
}
// 更新maxCount
if (count == maxCount) {
res.add(root.val);
} else if (count > maxCount) {
maxCount = count;
res.clear();
res.add(root.val);
}
preNode = root;
// 右
transfer(root.right);
}
}
体会更新maxCount时对数组的操作
LeetCode236 二叉树的最近公共祖先
public class code236 {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (root == p || root == q) return root;
// 左
TreeNode left = lowestCommonAncestor(root.left, p, q);
// 右
TreeNode right = lowestCommonAncestor(root.right, p, q);
// 中
if (left != null && right != null) {
return root;
} else if (left == null && right != null) {
return right;
} else if (left != null && right == null) {
return left;
} else {
return null;
}
}
}