530.二叉搜索树的最小绝对差
二叉搜索树,中序遍历,值是从小到大排列的,所以我们用当前值减去前一个值,就能得到差,然后用全局变量比较和保存差值。
搜索树题目感觉都要使用全局变量,这里我们定义两个,一是前一个节点,二是结果:最小差值。
- 确定返回值和参数:可以直接使用模板方法。
- 确定终止条件:当节点为空时直接返回我们定义的全局最小值变量。
- 确定单层递归逻辑:左遍历完后,首先判断前一个节点是否为空,不为空就求当前节点和前一个节点的差,然后跟全局最小值比较,如果更小就更新;然后把前一个节点指向当前节点,进入下一次遍历。
TreeNode preNode = null;
int minDiff = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if (root == null) {
return minDiff;
}
getMinimumDifference(root.left);
if (preNode != null) {
int diff = Math.abs(root.val - preNode.val);
minDiff = Math.min(diff, minDiff);
}
preNode = root;
getMinimumDifference(root.right);
return minDiff;
}
501.二叉搜索树中的众数
讲解链接:代码随想录-501.二叉搜索树中的众数
二叉搜索树,优先想到中序遍历,因为使用中序遍历,可以保证值是从小到大递增的。
这道题有难度的是如何维持好每次遍历的结果。这里我们需要4个全局变量,分别是:最大重复数量,最近一次连着的数量,上一个节点,结果集。
在中间写逻辑代码,具体代码看注释。
int maxCount = 0;
int count = 0;
List<Integer> result = new ArrayList<>();
TreeNode preNode = null;
public int[] findMode(TreeNode root) {
inorderTraversal(root);
return result.stream().mapToInt(a -> a.intValue()).toArray();
}
public void inorderTraversal(TreeNode root) {
if (root == null) return;
/* 左 */
inorderTraversal(root.left);
/* 中 */
// 如果前一个节点为空,或则前一个节点的值不等于当前节点的值,重置Count
if (preNode == null || preNode.val != root.val) {
count = 1;
} else {
count++;
}
// 当前值等于最大值,直接添加
if (count == maxCount) {
result.add(root.val);
} else if (count > maxCount) { // 当前值出现数量大于最大数量,清空集合,然后只添加当前值
result.clear();
result.add(root.val);
maxCount = count;
}
preNode = root;
/* 右 */
inorderTraversal(root.right);
}
236.二叉树的最近公共祖先
讲解链接:代码随想录-236.二叉树的最近公共祖先
提示:后序遍历
- 确定返回值和参数:直接用模板方法就行
- 确定递归终止条件:如果当前节点等于需要查找的节点,就直接返回当前节点。
- 确定单层递归逻辑:后序遍历,遍历完左子树和右子树,分别用两个变量接收,如果两个变量都不为空,说明当前节点就是公共祖先,可以直接返回了。如果只有一个节点不为空,返回这个不为空的节点。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (root == p || root == q) {
return root;
}
TreeNode node1 = lowestCommonAncestor(root.left, p, q);
TreeNode node2 = lowestCommonAncestor(root.right, p, q);
if (node1 != null && node2 != null) return root;
else if (node1 != null) return node1;
else if (node2 != null) return node2;
return null;
}
总结
不知道这两天是状态不好还是基础不扎实,勉强可以想到方式,但是竟然没法实现,实现后很多bug,慢慢修改才通过,通过也是碰运气过的,没太大概念。