LeetCode 530.二叉搜索树的最小绝对差
题目链接:530.二叉搜索树的最小绝对差
思路:题目中要求返回BST中任意两个结点的最小绝对差值。由于BST的特性 中序遍历是有序的 所以如果是最小绝对差值那么这两个结点在中序遍历中一定是相邻的。如果采用双指针的策略。一个快指针,一个慢指针。那么最后的值肯定是快指针的值减去慢指针的值。事先定义一个变量res,res一开始存放一个很大的值 例如INT_MAX 然后开始用快慢指针中序遍历二叉树。用慢指针案来操作中的遍历逻辑。因为当慢指针为空才是代表遍历结束。当慢指针不为空的时候,用res接受res和快指针-慢指针的最小值。这样最后得出res就是最小绝对差
具体实现:
class Solution {
TreeNode pre;
int res=Integer.MAX_VALUE;;
public int getMinimumDifference(TreeNode root) {
traversal(root);
return res;
}
public void traversal(TreeNode cur){
if (cur==null){
return;
}
traversal(cur.left);
if (pre!=null){
res = Math.min(res,Math.abs(cur.val-pre.val));
}
pre = cur;
traversal(cur.right);
}
}
LeetCode 501.二叉搜索树中的众数
题目链接:501.二叉搜索树中的众数
思路:返回出现次数最多的元素,相同出现次数一起返回形成一个数组。那么必然是要统计每个元素出现的次数。而且是BST 一眼中序遍历。同样是使用双指针。和530一样。当遍历第一个元素count值为1.然后当快指针与慢指针的值相同时,count++,如果不同count直接设为1代表该元素出现了一次。同时这里还要设置另外一个遍历maxCount,maxCount初值可以为0.因为count是不断变化的,肯定要一个遍历不断存放最大的count。如果count>maxCount,就将count赋值给maxCount。同时我们的结果数组要清零。并将此时count对应的快慢指针指向的元素放入结果数组。每当count==maxCount时候就代表此时对应的快慢指针的值就是要找的值就应该放入结果数组中
具体实现:
class Solution {
TreeNode pre;
int count =0;
int maxcount=0;
List<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
find(root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
public void find(TreeNode root){
if (root==null){
return;
}
find(root.left);
if (pre==null){
count=1;
}else if (pre.val ==root.val){
count++;
}else {
count=1;
}
if (count==maxcount){
list.add(root.val);
}
if (count>maxcount){
maxcount=count;
list.clear();
list.add(root.val);
}
pre = root;
find(root.right);
}
}
LeetCode 236. 二叉树的最近公共祖先
题目链接:236. 二叉树的最近公共祖先
思路:本题要求返回任意两个结点的最近的公共祖先。其实是一个从下不断往上的过程。应当采取后序遍历。当遍历到给的两个结点时候,需要把当前的结点向上一层递归返回。
具体实现:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root==null){
return root;
}
//遇到p和q向上返回
if (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;
}
//左边的返回值不为空 右边的返回值为空 则代表p和q不在右子树 需要返回左子树
if (left!=null && right==null){
return left;
}
//右边的返回值不为空 左边的返回值为空 则代表p和q不在左子树 需要返回右子树
if (left==null && right!=null){
return right;
}
return null;
}
}