基于二分查找,可以拓展出许多算法问题。
在前面的学习中,我们可以发现许多题使用前序、后序或者层次遍历都可以解决,但几乎没有中序遍历的,这是因为前后序遍历与中序有不一样的特征,中序遍历可以和搜索树结合在一起,而前后序不行。
下面我们来研究一下中序搜索的问题
二叉搜索树中搜索特定值
LeetCode700:
给定二叉搜索树(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
输出:[]
思路:
如果根节点为null ,返回空值;
如果根节点的值等于搜索值,返回根节点
如果val < root.val,进入根节点的左子树查找
如果val > root.val,进入根节点的右子树查找
public static 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);
// }
//迭代
if (root == null || root.val == val){
return root;
}
while (root != null && val != root.val) {
if (val < root.val) {
root = root.left;
} else {
root = root.right;
}
}
return root;
}
验证二叉搜索树
LeetCode98:
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。
有效二叉搜索树定义如下:
节点的左子树只包含小于当前节点的数;
节点的右子树只包含大于当前节点的数;
所有左子树和右子树自身必须也是二叉搜索树。
示例1:
输入:root = [2,1,3]
输出:true
示例2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是5,但是右子节点的值为4
思路:
如果二叉树为空,则返回true;
如果不为空,先访问他的左子树;
中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足二叉搜索树,继续遍历,否则返回false;
最后访问右子树。
long pre = Long.MIN_VALUE;
public boolean isSearchTree(TreeNode root){
if (root == null){
return true;
}
//访问左子树
if (!isSearchTree(root.left)){
return false;
}
if (root.val <= pre){
return false;
}
pre = root.val;
//访问右子树
return isSearchTree(root.right);
}