给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
思路 :使用双指针中序遍历的方式遍历。
1,没有返回值,传入根节点,中序遍历二叉树
2,从底层开始遍历,设置一个pre指针初始化为空,cur为当前节点。当pre不为空是说明cur已经指向pre的上一个节点,这时候我们返回两个节点直接的插值跟result比较的最小值。
之后将pre执行cur,双指针移动
3,遍历右子树。
class Solution {
//使用双指针递归遍历二叉树
TreeNode pre=null;
int result=Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
travel(root);
return result;
}
public void travel(TreeNode cur){
if(cur==null) return;
//单层递归逻辑
//使用中续遍历
travel(cur.left);
if(pre!=null){
result=Math.min(cur.val-pre.val,result);
}
pre=cur;
travel(cur.right);
}
}
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
思路:继续使用双指针
使用pre指针初始化为空指向后一个节点,count初始化为0计算当前节点出现的个数,一个最大值初始化为0.负责记录众数出现次数的最大值。
1,无返回值,结果存储在res集合之中,传入根节点。
2,使用中序遍历的方式首先遍历左子树,之后判断如果pre指针不为空,说明cur已经指向前一个结点,如果此时,pre为空。则count=1,这时候就只有一个数,如果pre和cur值相等,将counet数量加一,相当于众数多了一位,否则,count数重新置为一,判断结束之后,如果当前count等于maxvalue将结果加入结果集之中,后续如果出现更大的maxvalue清空结果集重新加入,
移动指针,遍历右子树。
class Solution {
List<Integer> res=new ArrayList<>();
TreeNode pre=null;
int count=0;
int maxvalue=0;
public int[] findMode(TreeNode root) {
travel(root);
int[] arr=new int[res.size()];
for(int i=0;i<res.size();i++){
arr[i]=res.get(i);
}
return arr;
}
private void travel(TreeNode cur){
//使用双指针的思路采用中续的顺序遍历二叉树
//递归结束条件
if(cur==null) return;
// 左
travel(cur.left);
//中
//pre节点为空说已经遍历到了最左的节点,当前众树数量加一
if(pre==null) count++;
else if(pre.val==cur.val) count++;
else count=1;
//如果当前众数数量等于maxvalue我们直接将其加入结果集
if(count==maxvalue) res.add(cur.val);
//如果当前众树数量大于maxvalue我们将结果集清空,重新加入
//新的结果集,更新最大值。
if(count>maxvalue){
res.clear();
res.add(cur.val);
maxvalue=count;
}
//移动指针,指向上一个节点
pre=cur;
//右
travel(cur.right);
}
}
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return back(root,p,q);
}
TreeNode back(TreeNode root,TreeNode p,TreeNode q){
if(root==null) return root;
//如果遇到p或者q直接讲pq结果返回给上一层节点
if(root==p || root==q) return root;
//进行后续遍历
TreeNode left=back(root.left,p,q);
TreeNode right=back(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;
}
}
BY 三条直线围墙