D20打卡

61 阅读1分钟

let700

//给定二叉搜索树(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, 5000] 范围内 
// 1 <= Node.val <= 10⁷ 
// root 是二叉搜索树 
// 1 <= val <= 10⁷ 
// 
//
// Related Topics 树 二叉搜索树 二叉树 👍 350 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode *searchBST(TreeNode *root, int val) {
        //这里我们就以递归法来实现这个题目
        //确定递归截止的条件
        if (root == NULL || root->val == val) {
            return root;
        }
        //之后的话就是单层递归逻辑的查看了
        TreeNode *result = NULL;
        //根据二叉搜索树的性质我们来写出我们的遍历的逻辑
        if (root->val > val) {
            result = searchBST(root->left, val);
        }
        if (root->val < val) {
            result = searchBST(root->right, val);
        }
        return result;


    }
};
//leetcode submit region end(Prohibit modification and deletion)
//给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 
//
// 有效 二叉搜索树定义如下: 
//
// 
// 节点的左子树只包含 小于 当前节点的数。 
// 节点的右子树只包含 大于 当前节点的数。 
// 所有左子树和右子树自身必须也是二叉搜索树。 
// 
//
// 
//
// 示例 1: 
// 
// 
//输入:root = [2,1,3]
//输出:true
// 
//
// 示例 2: 
// 
// 
//输入:root = [5,1,4,null,null,3,6]
//输出:false
//解释:根节点的值是 5 ,但是右子节点的值是 4 。
// 
//
// 
//
// 提示: 
//
// 
// 树中节点数目范围在[1, 10⁴] 内 
// -2³¹ <= Node.val <= 2³¹ - 1 
// 
//
// Related Topics 树 深度优先搜索 二叉搜索树 二叉树 👍 1843 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode *pre = NULL;//我们在这里定义我们的前面的节点

    bool isValidBST(TreeNode *root) {
        //递归的终止条件
        if (root == NULL) {
            return true;
        }
        //验证是否是平衡二叉树
        bool leftNode = isValidBST(root->left);
        //中序处理逻辑
        if (pre != NULL && pre->val >= root->val) { //这个不为空的判断其实也是很重要的
            return false;
        }
        pre = root;
        bool rightNode = isValidBST(root->right);
        return leftNode && rightNode;

    }
};
//leetcode submit region end(Prohibit modification and deletion)