「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战」。
二叉搜索树中的搜索
题目描述
给定二叉搜索树(BST)的根节点root
和一个整数值val
。
你需要在BST中找到节点值等于val
的节点。返回以该节点为根的子树。如果节点不存在,则返回null
。
示例1:
输入: root = [4,2,7,1,3], val = 2
输出: [2,1,3]
示例2:
输入: root = [4,2,7,1,3], val = 5
输出: []
算法解析
在解这道题目之前,我们先来学习一下二叉搜索树的性质吧!
- 若它的左子树不空,则左子树上所有结点的值均小于根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于根结点的值
- 它的左右子树也都是二叉排序树
二叉排序树的节点都是有序的,通常情况下我们都会采用中序遍历
,这道题目实质上就是利用二叉搜索树的性质遍历二叉树,详细步骤如下
1.从根节点出发进行比较,
- 如果给定的整数值大于根节点,去右子树进行查找
- 如果给定的整数值小于根节点,去左子树进行查找
2.可以递归的方法进行查找,查找的节点值等于该整数值则表示查找成功,反之则查找失败,返回null
代码
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
//排除空二叉树和根节点为整数值的情况
if(root==null||root.val==val){
return root;
}
//如果给定的整数值小于根节点,递归遍历左子树
if(val<root.val){
return searchBST(root.left,val);
}else{
//如果给定的整数值大于根节点,递归遍历右子树
return searchBST(root.right,val);
}
}
}
二叉搜索树的最小绝对差
题目描述
给你一个二叉搜索树的根节点root
,返回树中任意两不用节点值之间的最小差值。
差值是一个正数,其数值等于两值之差的绝对值。
示例1:
输入: root = [4,2,6,1,3]
输出: 1
示例2:
输入: root = [1,0,48,null,null,12,49]
输出: 1
算法解析
在上一道题中我们列举了二叉搜索树的性质,二叉搜索树中序遍历时是有序的,因此我们可以就将二叉搜索树看成一个有序的数组,然后计算数组间元素的最小绝对差即可。中序遍历的顺序是左子树-->根节点-->右子树。
代码解析
class Solution {
//记录前一个遍历的节点的值,初始值为空值
int pre=-1;
//定义value为二叉搜索树的绝对差,
int value=Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if(root==null)return 0;
trave(root);
return value;
}
public void trave(TreeNode root){
//采用中序遍历
if(root==null)return;
//递归遍历左子树
trave(root.left);
//递归遍历根节点
if(pre==-1){
pre=root.val;
}else{
value=Math.min(value,root.val-pre);
pre=root.val;
}
//递归遍历右子树
trave(root.right);
}
}