今日内容:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先
代码随想录:代码随想录 (programmercarl.com)
530.二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点
root,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
因为是二叉搜索树,因此只需要比较两个子节点和这个节点的两个边界值之间的差值,然后取最小值。 因此递归的话需要传两个指针。返回的条件是没有左右孩子。返回值为最小值。
然后发现写不了,看了答案发现自己想多了,先用中序遍历遍历完就好了,其中计算一下差值。
class Solution {
TreeNode pre;
int result = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if(root == null)return 0;
traversal(root);
return result;
}
private 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.二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点
root,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
因为要找到所有的众数,所以需要一个list记录所有的众数,而众数就是出现次数最多的数字,因此要用count记录数字出现的个数,并用maxcount记录最大的出现数,因此当count等于maxcount时,就可以添加新的众数,当count大于maxcount时,就要清空list。
class Solution {
ArrayList<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[] res = new int[resList.size()];
for(int i = 0; i < resList.size(); i++)res[i] = resList.get(i);
return res;
}
private 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++;
}
if(count > maxCount){
resList.clear();
resList.add(rootValue);
maxCount = count;
}else if(count == maxCount){
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
}
}
236.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。 即情况一:
判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。 但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。 情况二:
其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。
因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况。一因为在左子树碰到q或者p,那么如果右子树为空,那么左子树根节点就是所求的节点。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || 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;
if(left == null)return right;
return left;
}
}
结束