二叉搜索树的特性:左子树比根节点都小,右子树比根节点大。中序遍历二叉搜索树是有序的。
700二叉搜索树中的搜索
题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)
递归法
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null)return null;
if(root.val<val){
return searchBST(root.right,val);
}else if(root.val>val){
return searchBST(root.left,val);
}else{
return root;
}
}
}
迭代法
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while(root!=null){
if(root.val>val){
root=root.left;
}else if(root.val<val){
root=root.right;
}else{
return root;
}
}
return null;
}
}
98验证二叉搜索树
题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)
注意:①节点定义的位置,定义成空,而不是初始化。②在树中定义两个指针,将前一个指针更新成当前指针。③中序遍历。
class Solution {
//注意节点定义的位置
TreeNode pre=null;
public boolean isValidBST(TreeNode root) {
//利用二叉搜索树的特性:中序遍历是一个有序数组,比较前一个节点和后一个结点的值
if(root==null)return true;
boolean left=isValidBST(root.left);
if(pre!=null&&root.val<=pre.val){
return false;
}
pre=root;
boolean right=isValidBST(root.right);
return left&&right;
}
}
530二叉搜索树的最小绝对差
题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
注意:①函数返回值的设定。root=null时,才可以返回空。②pre的定义。③中序遍历解决。
class Solution {
//利用二叉搜索树中序遍历有序的规律,比较前后两个节点值,最小值一定在他们之间
//注意pre初始化后不为null,pre.val=0。因此不能初始化
TreeNode pre;
int res=Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
tranverse(root);
return res;
}
public void tranverse(TreeNode root){
if(root==null) return;
tranverse(root.left);
if(pre!=null){
res=Math.min(res,root.val-pre.val);
}
pre=root;
tranverse(root.right);
}
}
501二叉搜索树中的众数
题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)
注意:①本题可以采用暴力破解法,即先遍历二叉树将所有节点元素都放到HashMap中,从中选取出现次数最多的树,放到数组中,具体可见代码随想录 (programmercarl.com)
②本题采用二叉搜索树的特性,一次遍历即可找到众数。利用两个指针和两个计数器。
③注意集合初始化,不初始化会报错。个人理解:对于集合来说,初始化意味着已经在内存中开辟一片空间,值等于默认泛型的初始值。只声明变量意味着没有内存空间,相当于null,无法对其进行添加、清空等操作。(对节点、基本数据类型也是)
lass Solution {
//如何用一次遍历获取众数,集合初始化和不初始化不同,不初始化会报错。
ArrayList<Integer> resList=new ArrayList<>();
int count=0;
int maxCount=0;
TreeNode pre=null;
public int[] findMode(TreeNode root) {
tranverse(root);
int len=resList.size();
int[] res=new int[len];
for(int i=0;i<len;i++){
res[i]=resList.get(i);
}
return res;
}
public void tranverse(TreeNode cur){
if(cur==null) return;
tranverse(cur.left);
if(pre==null){
count=1;
}else if(pre.val==cur.val){
count++;
}else if(pre.val!=cur.val){
count=1;
}
pre=cur;
if(count>maxCount){
resList.clear();
maxCount=count;
resList.add(cur.val);
}else if(count==maxCount){
resList.add(cur.val);
}
tranverse(cur.right);
}
}