二叉搜索树
二叉搜索树 (BST) 的核心性质是:左子树 < 根 < 右子树。这意味着对 BST 进行中序遍历会得到一个递增序列。
530. 二叉搜索树的最小绝对差 (Minimum Absolute Difference in BST)
题目描述
给你一个二叉搜索树的根节点 root ,返回 树中任意两个不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
解题思路
中序遍历 + 前驱节点比较。
- 维护全局变量
pre记录上一个遍历到的节点值。 - 递归中序遍历。
- 计算
root.val - pre并更新全局最小值。
Java 代码实现
class Solution {
int min = Integer.MAX_VALUE;
Integer pre = null;
public int getMinimumDifference(TreeNode root) {
dfs(root);
return min;
}
private void dfs(TreeNode root) {
if (root == null) return;
dfs(root.left);
if (pre != null) min = Math.min(min, root.val - pre);
pre = root.val;
dfs(root.right);
}
}
230. 二叉搜索树中第 K 小的元素 (Kth Smallest Element in a BST)
题目描述
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
解题思路
中序遍历计数。
- 递增遍历 BST。
- 定义计数器
count。当count == k时,当前节点值即为所求。
Java 代码实现
class Solution {
int res, k;
public int kthSmallest(TreeNode root, int k) {
this.k = k;
dfs(root);
return res;
}
private void dfs(TreeNode root) {
if (root == null) return;
dfs(root.left);
if (--k == 0) { res = root.val; return; }
dfs(root.right);
}
}
98. 验证二叉搜索树 (Validate Binary Search Tree)
题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
解题思路
中序遍历严格递增。
- BST 的中序遍历序列必须是严格单调递增。
- 维护
long pre(考虑到边界使用 Long.MIN_VALUE) 记录前一个值。 - 如果
root.val <= pre返回 false。
Java 代码实现
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
if (!isValidBST(root.left)) return false;
if (root.val <= pre) return false;
pre = root.val;
return isValidBST(root.right);
}
}
(注:也可以通过递归传递 (min, max) 范围进行判定)。