Leetcode 530
https://leetcode.com/problems/minimum-absolute-difference-in-bst/
题目的第一想法:
这道题很自然的会让人觉得需要追踪之前的node来做一个比较,但在最初实现的时候出了岔子没能成功完成。最初出现的问题在于更新pre节点的时间。(如果在left前更新的话会出现pre节点总是和root相同的问题)应该在对当前节点做操作的时候(中)而非左或右。
class Solution {
int diff = Integer.MAX_VALUE;
TreeNode pre;
public int getMinimumDifference(TreeNode root) {
if(root == null){
return 0;
}
getMinimumDifference(root.left);
if(pre != null){
diff = Math.min(diff, Math.abs(root.val - pre.val));
}
pre = root;
getMinimumDifference(root.right);
return diff;
}
}
看完代码随想录之后的想法:
看完以后知道了逻辑觉得就还好,也不是很困难。
Leetcode 501
题目的第一想法:
这道题给我的感觉是想要把tree做和list一样的操作,但在储存的数据结构上吃了瘪。我最一开始想用hashmap来做,然后觉得用pq和pair来写会容易一些。但到最后也觉得不好更新pq内的内容。觉得我的想法可能出了些问题。然后发现其实直接做List,使用一个当前count和一个最大值来判断,加内容会更容易些。
class Solution {
int count = 0;
int max = 0;
List<Integer> list = new LinkedList<>();
TreeNode pre;
public int[] findMode(TreeNode root) {
traversal(root);
int[] rlist = list.stream().mapToInt(i->i).toArray();
return rlist;
}
public void traversal(TreeNode root){
if(root == null) return;
traversal(root.left);
if(pre != null){
if(pre.val == root.val){
count++;
}else{
count = 0;
}
}
if(count > max){
max = count;
list.clear();
list.add(root.val);
}else if(count == max){
list.add(root.val);
}
pre = root;
traversal(root.right);
}
}
看完代码随想录之后的想法:
这道题和530还是有相似之处的,遍历方式和530很接近但也有相应的变化。顺便说一下,这个如果直接对值,而不是对节点操作的话会快很多。
Leetcode 236
题目的第一想法:
这道题的难点我觉得在于需要知道到底需不需要对返回的值做操作,于是就涉及到了到底是部分遍历还是全部遍历。我最初的设想是返回bool的值来判断左子树和右子树是否包含要找的节点。但后来发现判断后无法返回root当前的内容,也就找不到共同的节点了。
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;
else if(left != null && right == null) return left;
else return right;
}
}
看完代码随想录之后的想法:
我觉得方法还是很巧妙的。我觉得对于这个问题我更多的是从结果反推遍历全图的原因。但对于什么时候遍历分支,什么时候遍历全图还是没有一个很完善的理解。