• (LeetCode C++)验证二叉搜索树


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

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

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

     

    示例 1:

    1. 输入:root = [2,1,3]
    2. 输出:true

    示例 2:

    1. 输入:root = [5,1,4,null,null,3,6]
    2. 输出:false
    3. 解释:根节点的值是 5 ,但是右子节点的值是 4

    提示:

    1. 树中节点数目范围在[1, 104] 内
    2. -2^31 <= Node.val <= 2^31 - 1

    首先,二叉树的实现是:

    1. // Definition for a binary tree node
    2. class TreeNode
    3. {
    4. public:
    5. int val;
    6. TreeNode *left;
    7. TreeNode *right;
    8. TreeNode()
    9. {
    10. this->val=0;
    11. this->left=nullptr;
    12. this->right=nullptr;
    13. }
    14. TreeNode(int x)
    15. {
    16. this->val=x;
    17. this->left=nullptr;
    18. this->right=nullptr;
    19. }
    20. TreeNode(int x,TreeNode *left,TreeNode *right)
    21. {
    22. this->val=x;
    23. this->left=left;
    24. this->right=right;
    25. }
    26. };

    Method 1:

    使用递归的方法验证二叉搜索树

    Code 1:

    1. class Solution{
    2. public:
    3. // 递归验证二叉搜索树
    4. bool Recurve(TreeNode *root,long max,long min){
    5. // 如果根节点为空
    6. // 说明访问到了叶节点
    7. if(root==nullptr){
    8. // 返回True
    9. return true;
    10. }
    11. // 如果根节点大于最大值或小于最小值
    12. // 即不满足二叉搜索树节点大小的性质
    13. if(root->val>=max||root->val<=min){
    14. // 返回False
    15. return false;
    16. }
    17. // 因为二叉搜索树的左右子树同样也是二叉搜索树
    18. // 因此递归遍历左右子树
    19. return Recurve(root->left,root->val,min)&&Recurve(root->right,max,root->val);
    20. }
    21. // 验证二叉搜索树
    22. bool isValidBST(TreeNode *root){
    23. // 递归验证二叉搜索树
    24. return Recurve(root,LONG_MAX,LONG_MIN);
    25. }
    26. };

    其中,由于给定条件:

    -2^31 <= Node.val <= 2^31 - 1

    因此,使用C++中的数值标识符来表示最大值和最小值。

    C++中的数值标识符相关知识可见:

    (Note)C++数值标识符_Think@的博客-CSDN博客

    使用数值标识符需要提前调用< limits >头文件。

    Method 2:

    使用中序遍历递归的方法验证二叉搜索树

    Code 2:

    1. class Solution{
    2. public:
    3. // 递归进行中序遍历以验证二叉搜索树
    4. bool Recurve(TreeNode *root,long &min){
    5. // 如果根节点为空
    6. // 则说明访问到了叶节点
    7. if(root==nullptr){
    8. // 返回True
    9. return true;
    10. }
    11. // 递归遍历左子树
    12. // 验证左子树是否为二叉搜索树
    13. bool l=Recurve(root->left,min);
    14. // 如果根节点小于左子树的最大值
    15. if(root->val<=min){
    16. // 则表明不满足二叉搜索树节点大小的性质
    17. return false;
    18. }
    19. // 记录当前根节点的值
    20. min=root->val;
    21. // 递归遍历右子树
    22. bool r=Recurve(root->right,min);
    23. // 因为二叉搜索树的左右子树同样也是二叉搜索树
    24. // 因此递归中序遍历以验证当前根节点的左右子树
    25. return l&&r;
    26. }
    27. // 验证二叉搜索树
    28. bool isValidBST(TreeNode *root){
    29. // 记录当前的最小值
    30. long min=LONG_MIN;
    31. // 递归进行中序遍历
    32. return Recurve(root,min);
    33. }
    34. };

    Method 3:

    使用栈进行中序遍历来验证二叉搜索树

    Code 3:

    1. class Solution{
    2. public:
    3. // 验证二叉搜索树
    4. bool isValidBST(TreeNode *root){
    5. // 记录当前的最小值
    6. long min=LONG_MIN;
    7. // 用栈来缓存进行中序遍历
    8. stack temp;
    9. // 如果栈不空或二叉搜索树没有遍历完毕
    10. // 就继续循环
    11. while(!temp.empty()||root!=nullptr){
    12. // 如果没有遍历到叶子结点
    13. while(root!=nullptr){
    14. // 将当前节点入栈
    15. temp.push(root);
    16. // 在遍历到叶子结点之前持续遍历左子树
    17. root=root->left;
    18. }
    19. // 将栈顶节点出栈
    20. root=temp.top();
    21. // 弹出栈顶节点
    22. temp.pop();
    23. // 如果根节点的值小于左子树的最大值
    24. if(root->val<=min){
    25. // 表明不满足二叉搜索树节点大小的性质
    26. return false;
    27. }
    28. // 如果满足性质,更新左子树的最大值
    29. min=root->val;
    30. // 在遍历完左子树和根节点之后
    31. // 转向遍历遍历右子树
    32. root=root->right;
    33. }
    34. return true;
    35. }
    36. };

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/validate-binary-search-tree

    Reference:

    【LeetCode】【C++】98. 验证二叉搜索树_None072的博客-CSDN博客

    (Note)C++数值标识符_Think@的博客-CSDN博客

     

  • 相关阅读:
    分布式与一致性协议之PBFT算法(一)
    IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知
    计算机网络
    关于 SAP UI5 所有控件的共同祖先 - sap.ui.base.ManagedObject
    浅析电力监控在新型数据中心的设计和应用-Susie 周
    离子交换树脂在除氨氮领域的应用
    海贼王大学生HTML网页制作作品 学生动漫网页设计模板下载 简单漫画网页设计成品 dreamweaver学生网站模板
    【SpringBoot】SpringBoot 读取配置文件中的自定义属性的 5 种方法
    win10系统下使用opencv-dnn部署yolov5模型
    java多线程基础——Callable接口及线程池补充
  • 原文地址:https://blog.csdn.net/qq_40728667/article/details/127090824