二叉搜索树中的搜索 LeetCode 700
题目链接:[LeetCode 700 - 简单]
思路
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
本题终止条件: if(root.val == val){ return root; } 递归逻辑: if(root.val > val){ return searchBST(root.left,val); }else if(root.val < val){ return searchBST(root.right,val); }
递归:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null)return null;
if(root.val == val){
return root;
}else if(root.val > val){
return searchBST(root.left,val);
}else if(root.val < val){
return searchBST(root.right,val);
}
return null;
}
}
验证二叉搜索树 LeetCode 98
题目链接:[LeetCode 98 - 简单]
思路
同样也是搜索二叉树 但是该题特别需要注意的是:必须采用中序遍历的方式 -> 采用中序遍历可以满足遍历的所有节点上的val从小到大排列。
本题终止条件: if(root == null) return true; if(!left) return false; if(root.val <= prev) return false; 递归逻辑: 中序遍历:左中右
递归:
class Solution {
private long prev = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null) return true;
boolean left = isValidBST(root.left);
if(!left) return false;
if(root.val <= prev) return false;
prev = root.val;
return isValidBST(root.right);
}
}
二叉搜索树的最小绝对差 LeetCode 530
题目链接:[LeetCode 530 - 简单]
思路
二叉搜索树的最小绝对差 -> 首先最对差一定大于0 因为二叉搜索树中序遍历的情况下,就是一个单调递增的数组
本题终止条件:没有明确终止条件 递归逻辑:中序遍历
递归:
class Solution {
private int prev = Integer.MIN_VALUE;
private int result = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if(root==null)return result;
int left = getMinimumDifference(root.left);
if(root.val - prev >0)
result = Math.min(result,root.val - prev);
prev = root.val;
int right = getMinimumDifference(root.right);
return result;
}
}
二叉搜索树中的众数 LeetCode 501
题目链接:[LeetCode 501 - 简单]
思路
暴力解法和不使用额外空间的两种做法。 本题终止条件:没有具体的终止条件 递归逻辑:采用中序遍历
递归:
class Solution {
ArrayList<Integer> resList = new ArrayList<>();
int count;
int maxCount;
TreeNode pre;
public int[] findMode(TreeNode root) {
count = 0;
maxCount = 0;
pre = null;
findMode1(root);
int[] res = new int[resList.size()];
for(int i=0;i<resList.size();i++){
res[i]=resList.get(i);
}
return res;
}
private void findMode1(TreeNode root){
if(root==null)return;
findMode1(root.left);
int rootValue = root.val;
if(pre == null || rootValue!=pre.val){
count = 1;
}else{
count++;
}
if(count > maxCount){
resList.clear();
resList.add(rootValue);
maxCount = count;
}else if(count == maxCount){
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
}
}