前言
- LeetCode 700:二叉搜索树中的搜索
- LeetCode 701:二叉搜索树的插入操作
- LeetCode 450:删除二叉搜索树中的节点
- LeetCode 108:将有序数组转换成二叉搜索树
一、什么是二叉搜索树
1、空树是二叉搜索树
2、若不为空则应具有以下3条性质:
- 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
- 若它的右子树不为空,则右子树上所有节点的值均小于它的根节点的值;
- 它的左右子树也均为二叉搜索树.
前提:二叉搜索树首先是一个二叉树。
二、二叉搜索树的操作
1.查找(递归查找是否存在key值)
LeetCode 700题:二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:
4
/ \
2 7
/ \
1 3
和值: 2
你应该返回如下子树:
2
/ \
1 3
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
(1)解题思路:
本题首先根据给定的根节点查找到目标节点key:二叉搜索树中的查找不需要遍历所有节点,二叉搜索树是一棵排序树,其中序遍历的结果是一个从小到大排序的数组,故在二叉搜索树中查找某个key值只需要搜索一条路径。
然后返回查找到的节点,完毕。
(2)代码如下:
class Solution {
public:
TreeNode* traversal(TreeNode* cur,int val){
if(cur==NULL) return NULL;//终止程序的条件
if(cur->val>val){
//若当前节点的值>val,则说明val存在于当前节点的左子树中,故需要向左查找
return searchBST(cur->left,val);
}else if(cur->val<val){
//若当前节点的值<val,则说明val存在于当前节点的右子树中,故需要向右查找
return searchBST(cur->right,val);
}else{
//若当前节点的值==val,则返回当前节点
return cur;
}
}
TreeNode* searchBST(TreeNode* root, int val) {
return traversal(root,val);
}
};
举例说明:
给定二叉搜索树:
4
/ \
2 7
/ \
1 3
和值: 2
若需要找到其树中值为2的节点,只需要从根节点向左查找到值为2节点即可,不需要向右查找,因为根节点右子树上节点的值均大于根节点的值,故对于二叉搜索树的查找操作只需要搜索一条路径,不需要遍历整棵树。
(3)递归步骤(以上述例子为例):
- 当 cur==root 时为0层,递归函数 traversal 执行到 return searchBST(cur->left,val); 进入1层递归;
- 当 cur==root->left 时为1层,递归函数 traversal 执行到 return cur; 得到了1层递归的返回值cur(cur为root->left),此时递归函数进入0层;
- 此时 cur==root 为0层,只有0层时的return才会结束递归函数。
(4)注意:
具有返回值的递归函数要牢记递归函数定义以及递归函数返回值是什么,在本题中递归函数的定义是:
- 找到值等于val的节点(所以 return searchBST(cur->left,val); 表示程序最终返回了值为val的节点,实际上函数到达0层的这条语句就结束了)
递归函数的返回值是什么:
- 若能找到节点,则返回值为值等于val的节点;
- 若不能找到节点,则返回值为NULL节点。