本文是力扣LeeCode-530、二叉搜索树的最小绝对差【二叉搜索树+pre辅助节点+DFS】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3]
输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49]
输出:1
提示:
- 树中节点的数目范围是 [2, 10^4]
- 0 <= Node.val <= 10^5
思路
注意是⼆叉搜索树,是有序的。
在⼆叉搜索树上求最值、差值==>⼀个有序数组上求最值,求差值
。
递归法
由于是二叉搜索树,所以直接中序遍历
其实,这道题把⼆叉搜索树转换成有序数组,然后遍历⼀遍数组,就统计出来最⼩差值了
但是我们其实可以在中序遍历过程中,就可以统计出来
需要⽤⼀个pre辅助节点记录⼀下cur节点的前⼀个节点
1、确定递归函数,返回值以及参数
由于是直接使用中序遍历,统计结果,故可以直接使用原题函数进行递归操作
int getMinimumDifference(TreeNode root)
2、确定终⽌条件
函数的返回值要求是int类型,并且当 root==null
时,要么是叶子结点,要么是只有一个节点的,题目要求节点数是>=2的,所以是遍历到叶子结点时的情况,如果递归函数的返回值是void,遇到叶子结点,直接return即可
if (root==null)return 0;
3、确定单层递归的逻辑
中序遍历直接写起来,为什么需要⽤⼀个pre辅助节点记录⼀下cur节点的前⼀个节点呢?
,因为二叉搜索树是水平从左往右递增的,找任意节点之间的最小绝对差,肯定是相邻的节点
getMinimumDifference(root.left); // 左
if (pre!=null){ // 中
result = Math.min(result,root.val-pre.val);
}
pre = root; // 记录前⼀个
getMinimumDifference(root.right); // 右
return result;
整体代码
class Solution {
TreeNode pre = null;
int result = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if (root==null)return 0;
getMinimumDifference(root.left);
if (pre!=null){
result = Math.min(result,root.val-pre.val);
}
pre = root;
getMinimumDifference(root.right);
return result;
}
}
最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢