代码随想录day18| 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
- 530.二叉搜索树的最小绝对差
- 思路
- 501.二叉搜索树中的众数
- 思路
- 236. 二叉树的最近公共祖先
- 思路
530.二叉搜索树的最小绝对差
思路
使用中序遍历二叉搜索数,得到的结果集是有序递增的数组,可以用双指针法在有序递增的数组中找最小绝对差
class Solution {
TreeNode pre = null;
TreeNode min =null;
public int getMinimumDifference(TreeNode root) {
getMin(root);
return min.val;
}
public void getMin(TreeNode root) {
if(root== null){
return ;
}
getMin(root.left);
if(pre!=null){
int diff = Math.abs(root.val-pre.val);
if(min == null){
min = new TreeNode(diff);
}else if(diff < min.val){
min.val = diff;
}
}
pre = root;
getMin(root.right);
}
}
501.二叉搜索树中的众数
思路
- 使用后序遍历二叉搜索树,得到有序的数组,再用滑动窗口寻找元素出现的频率,并记录到结果集中。
- 注意:只要找到出现频率更高的元素,就清空之前收集的结果集
class Solution {
TreeNode slow = null;
int sum = 0;
int max = 0;
List<Integer> list = new ArrayList();
public int[] findMode(TreeNode root) {
getMaxNum(root);
int[] nums = new int[list.size()];
for(int i = 0 ; i < list.size() ; i++){
nums[i] = list.get(i);
}
return nums;
}
public void getMaxNum(TreeNode root) {
if(root == null){
return ;
}
getMaxNum(root.left);
if(slow == null){
slow = root;
sum = 1;
max = sum;
list.add(root.val);
}else{
if(slow.val!=root.val){
slow = root;
sum = 1;
if(sum > max){
max = sum;
list.clear();
list.add(slow.val);
}else if(sum == max){
list.add(slow.val);
}
}else if(slow.val == root.val){
sum+=1;
if(sum > max){
max = sum;
list.clear();
list.add(slow.val);
}else if(sum == max){
list.add(slow.val);
}
}
}
getMaxNum(root.right);
}
public void delete(List<Integer> list){
for (int i: list){
list.remove(i);
}
}
}
236. 二叉树的最近公共祖先
思路
具体思路
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return getCommonAncestor(root, p, q);
}
public TreeNode getCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return null;
}
if(root == p || root == q){
return root;
}
TreeNode left = getCommonAncestor(root.left, p, q);
TreeNode right = getCommonAncestor(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;
}
}
}