1.LeetCode 530.二叉搜索树的最小绝对差
题目链接:力扣刷题
视频讲解:B站视频讲解
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
递归:因为二叉搜索树是有规律的,我们采取中序遍历,每次去统计2个节点的值,能后随时去更新这个最小值。
思路:定义一个TreeNode pre节点存放的是上一个节点,默认为空,定义一个int 类型的minValue;默认值给Integer.maxvalue.
1.传参和返回值:因为需要遍历整个二叉树,所以在递归方法不需要返回值,传参为TreeNode,在主方法调用递归方法,最后返回minValue即可。
2.终止条件:当root节点为空的时候,结束;
3.单边递归条件:采用中序遍历就好,传参是root.left不为空;
java代码递归方法代码如下:
class Solution {
// 定义一个前节点,默认为空
TreeNode pre;
// 因为是返回最小值,所以定义一个最大值
int minValue =Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
// 调用递归方法
revers(root);
return minValue;
}
// 递归方法,因为要遍历整个二叉树,所以不需要返回值
public void revers(TreeNode root){
if(root == null){
return;
}
// 中序遍历,先处理左节点
revers(root.left);
// 如果当前节点不为空,那就说明走到倒数第二个节点了,此时开始记录最小值
if(pre !=null){
minValue = Math.min(minValue,root.val - pre.val);
}
// 遍历到最后一个节点了,我们需要把root值返回给pre,这样才可以用倒数第二个节点的val减去倒数第一个节点的值,开始递归,求最小值
pre =root;
// 开始处理右节点
revers(root.right);
}
}
思路二:层序遍历
层序遍历也是一样,定义一个前节点,定义一个最大值,借助栈来实现中序遍历。
和之前逻辑略有区别,之前是直接把根节点压入栈中,在判断栈是否为空,这次我们判断栈是不是空或者root节点为不为空,不为空一直往左遍历,遍历到最后,取出最后一个节点作为pre节点,在开始遍历右节点,开始计算最小值。
class Solution {
TreeNode pre;
int minValue = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root){
if (root == null){
return 0;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode temp = root;
// 改一下判断条件,我们先不把root压入到栈中,而是判断栈是否为空,或者temp不为空
while(!stack.isEmpty() || temp != null){
if(temp != null){
// 中序遍历,先把中节点压入栈中,在一直往左边走
stack.push(temp);
temp = temp.left;
}else{
// 走到最后,temp.left == null,那就取出这个节点,并且赋值给到pre做为前一个节点
temp = stack.pop();
// 进行计算最小值
if(pre != null){
minValue = Math.min(temp.val - pre.val,minValue);
}
pre = temp;
// 左子树的左节点遍历了,开始遍历右节点
temp = temp.right;
}
}
return minValue;
}
}
1.LeetCode 236二叉树的最近公共祖先
题目链接:力扣刷题
视频讲解:力扣刷题
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
Java代码如下(递归法):
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return reverse(root,p,q);
}
public TreeNode reverse(TreeNode root,TreeNode p,TreeNode q){
// 当root为空或者p,q一个等于root,那就root是最终节点,直接返回即可。
if(root == null || root ==p || root ==q){
return root;
}
TreeNode left = reverse(root.left,p,q);
TreeNode right = reverse(root.right,p,q);
// 如果左右都存在,那就返回root;
if(left != null && right != null){
return root;
}
// 如果左存在,右节点为空,那就返回左节点
if(left != null && right ==null){
return left;
}
// 如果右节点存在,那就返回右节点
if(left == null && right != null){
return right;
}
// 如果都不存在,那就返回null
if(left == null && right == null){
return null;
}
return null;
}
}