文章目录
-
-
-
- 二叉搜索树的简介
- [98. 验证二叉搜索树](https://leetcode-cn.com/problems/validate-binary-search-tree/)
- [700. 二叉搜索树中的搜索](https://leetcode-cn.com/problems/search-in-a-binary-search-tree/)
- [701. 二叉搜索树中的插入操作](https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/)
- [450. 删除二叉搜索树中的节点](https://leetcode-cn.com/problems/delete-node-in-a-bst/)
- [面试题54. 二叉搜索树的第k大节点](https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/)
- [938. 二叉搜索树的范围和](https://leetcode-cn.com/problems/range-sum-of-bst/)
-
-
二叉搜索树的简介
二叉搜索树是这样的二叉树:任意一个节点,其左儿子节点小于它,右儿子节点大于它
4
/ \
2 7
/ \
1 3
因此,二叉搜索树的具有非常高效的查找、插入和删除操作。
且,二叉搜索树的中序遍历,是一个递增的序列
98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
分析:每个节点,需要大于左儿子节点的值,小于右儿子节点的值。且其左儿子和右儿子都是符合二叉搜索树的,很显然可以用递归解决。需要注意的是,右子树的所有节点的值必须都大于根节点,左子树的所有结点的值都必须小于根节点,因此需要设置一个辅助函数来限制范围。
- 空则true
- 该结点的值没有在限制的范围内,则返回false
- 否则返回两个子树的helper,需要更新子树的限制范围
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == NULL) return true; //为空返回true
if (root -> val <= lower || root -> val >= upper) return false;
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX); //根没有限制
}
};
700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:
4
/ \
2 7
/ \
1 3
值: 2
你应该返回如下子树:
2
/ \
1 3
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
分析:二叉搜索树的搜索是最基础的应用,如果要搜的结点值小于当前结点,则向左走,否则向右走,直至找到或者为空。
//递归方式
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