给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1
题目地址
由于是二叉搜索树,可利用其特性,左子树到根节点再到右子树刚好是从小到大的,因此可以用中序遍历,将每个元素的值放到数组里,再判断该数组是不是递增;也可以创建节点不断记录前一个节点是否小于该节点
class Solution {
//记录节点
TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if(root == null){return true;}
boolean left = isValidBST(root.left);
if(pre != null && pre.val >= root.val){
return false;
}
pre = root;
boolean right = isValidBST(root.right);
return left && right;
}
}
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49] 输出:1
提示:
树中节点的数目范围是 [2, 104]
0 <= Node.val <= 105
题目地址
通过二叉搜索数的特性,使用一个节点记录前一节点,不断进行比较
class Solution {
int result = Integer.MAX_VALUE;
TreeNode pre = null;
public int getMinimumDifference(TreeNode root) {
if(root == null){return 0;}
result(root);
return result;
}
//要设置一个全局变量,因此再创建递归方法不需要用返回值
public void result(TreeNode node){
if(node == null){return;}
result(node.left);
if(pre != null){
result = Math.min(result,node.val - pre.val);
}
pre = node;
result(node.right);
}
class Solution {
int result = Integer.MAX_VALUE;
TreeNode pre = null;
public int getMinimumDifference(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while(node != null || !stack.isEmpty()){
if(node != null){
stack.push(node);
node = node.left;
}else{
node = stack.pop();
if (pre != null) { // 中
result = Math.min(result, node.val - pre.val);
}
pre = node;
node = node.right; // 右
}
}
return result;
}
}
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
示例 2:
输入:root = [0] 输出:[0]
提示:
树中节点的数目在范围 [1, 104] 内
-105 <= Node.val <= 105
题目地址
利用二叉搜索树的特性,要注意众数会有很多个,且得出的结果集是元素,而不是个数
class Solution {
int result = 0;
int count = 0;
TreeNode pre = null;
ArrayList<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
if(root == null){
return null;
}
result(root);
int[] res = new int[list.size()];
for(int i = 0;i<res.length;i++){
res[i] = list.get(i);
}
return res;
}
public void result(TreeNode node){
if(node == null){return;}
result(node.left);
if(pre == null || node.val != pre.val){
count = 1;
}else{
count++;
}
if(count == result){list.add(node.val);}
if(count > result){
result = count;
list.clear();
list.add(node.val);
}
pre = node;
result(node.right);
}
}