力扣算法 98. 验证二叉搜索树 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数

学习内容

力扣算法

98. 验证二叉搜索树

530. 二叉搜索树的最小绝对差

501. 二叉搜索树中的众数

具体内容

98. 验证二叉搜索树

给你一个二叉树的根节点 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;
	}
}

530. 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 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

题目地址

做题思路

通过二叉搜索数的特性,使用一个节点记录前一节点,不断进行比较

解题

1、递归
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);
	}
2、迭代
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;
	}
}

501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(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);
	}
}

你可能感兴趣的:(算法,数据结构,c++)