一、530.二叉搜索树的最小绝对差
注意是二叉搜索树,二叉搜索树可是有序的。和上一次验证二叉搜索树差不多,在上次的基础上加上求差值的代码即可。
采用双指针法,一个指向前一结点,另一个指向后一结点
class Solution {
TreeNode pre;
int result=Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if(root==null) return 0;
traversal(root);
return result;
}
public void traversal(TreeNode cur)
{
if(cur==null) return ;
traversal(cur.left);
if(pre!=null)
result=Math.min(result,cur.val-pre.val);
pre=cur;
traversal(cur.right);
}
}
二、501.二叉搜索树中的众数
二叉搜索树,采用中序遍历,双指针来实现。
遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。
弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
如果pre==cur,count就++,否则count=1;
class Solution {
ArrayList<Integer>resList;
int count;
int maxCount;
TreeNode pre;
public int[] findMode(TreeNode root) {
resList=new ArrayList<>();
count=0;
maxCount=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;
}
public void findMode1(TreeNode root) {
if(root==null) return;
findMode1(root.left);
int rootValue=root.val;
if(pre==null||pre.val!=rootValue)
{
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);
}
}
求maxCount 并输出众数:
if (count > maxCount) {
resList.clear();
resList.add(rootValue);
maxCount = count;
} else if (count == maxCount) {
resList.add(rootValue);
}
三、236. 二叉树的最近公共祖先
二叉树如何可以自底向上查找呢?
回溯,二叉树回溯的过程就是从低到上。
后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。
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) { // 若未找到节点 p 或 q
return null;
}else if(left == null && right != null) { // 若找到一个节点
return right;
}else if(left != null && right == null) { // 若找到一个节点
return left;
}else { // 若找到两个节点
return root;
}
}
}