LeetCode学习-第八天

文章目录

一、98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    bool searchBST(TreeNode *root, long long low, long long high){
        if (root == nullptr){
            return true;
        }
        if (root->val <= low || root->val >= high){
            return false;
        }
        return searchBST(root->left, low, root->val) && searchBST(root->right, root->val, high);
    }
    bool isValidBST(TreeNode* root) {
        //很明显也是一道递归题目
        return searchBST(root, LONG_MIN, LONG_MAX);
        
    }
};

二、653. 两数之和 IV - 输入 BST

要知道二叉搜索树的中序遍历是升序,将遍历输出存为数组
再使用首位两个指针队目标值进行搜索

class Solution {
public:
    bool findTarget(TreeNode* root, int k) {
        //这题和二叉搜索树有什么关系,关键应该是二叉搜索树的中序遍历是升序排列的
        vector<int> q;
        InOrder(root, q);
        int j = q.size() - 1;
        int i = 0;
        while (i < j){
            int sum = q[i] + q[j];
            if (sum == k){
                return true;
            }
            if (sum < k){
                i++;
            }
            else {
                j--;
            }
        }
        return false;
    }
    void InOrder(TreeNode* root, vector<int> &q){
        if (root == nullptr){
            return;
        }
        InOrder(root->left, q);
        q.push_back(root->val);
        InOrder(root->right, q);

    }
    
};

三、235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
LeetCode学习-第八天

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //因为二叉搜索树是左子树小于右子树,
       
        while(1){
            if (root->val < p->val && root->val < q->val){
                root = root->right;
            }
            if (root->val > p->val && root->val > q->val){
                root = root->left;
            }
            else{
            break;
            }
        }
        return root;
    }
};
上一篇:Linux用户管理


下一篇:es集群相关知识点