当前位置: 首页 > article >正文

【leetcode题解C++】98.验证二叉搜索树 and 701.二叉搜索树中的插入操作

98. 验证二叉搜索树

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

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

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

示例 1:

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

示例 2:

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

思路:要验证肯定要遍历,想到如果符合二叉搜索树的话,中序遍历的结果就会是从小到大的,判断一下即可。若需要判断,那么需要加上一个临时结点来记录上一个遍历的结点。

代码实现:

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack<TreeNode *> stk;
        TreeNode *cur = root;
        TreeNode *pre = nullptr;
        while(cur || !stk.empty()) {
            if(cur) {
                stk.push(cur);
                cur = cur->left;
            }
            else {
                cur = stk.top();
                stk.pop();
                if(pre && cur->val <= pre->val) return false;
                pre = cur;
                cur = cur->right;
            }
        }
        return true;
    }
};

701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

思路:想了想,要是重构二叉树好像有些复杂,这样的话,始终添加为叶子结点就好。那么,还是会用到两个结点,一个cur用于遍历和判断,另一个pre用于在判断找到叶子结点后,再判断添加为左孩子(新节点小)还是右孩子(新节点大)。

代码实现:

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root == nullptr) {
            TreeNode *node = new TreeNode(val);
            return node;
        }
        TreeNode *cur = root;
        TreeNode *pre = nullptr;
        while(cur) {
            pre = cur;
            if(cur->val > val) cur = cur->left;
            else if(cur->val <= val) cur = cur->right;
        }
        TreeNode *node = new TreeNode(val);
        if(pre->val > val) pre->left = node;
        else if(pre->val <= val) pre->right = node;
        return root;
    }
};

http://www.kler.cn/a/227350.html

相关文章:

  • 参考数据集INRIA Holidays dataset
  • 前端学习之路(4) vue2和vue3的区别
  • 我们都活在一台「思考机器」里
  • 如何确定python包的依赖关系
  • 【AG32VF407】国产MCU+FPGA Verilog双边沿检测输出方波
  • 洗地机哪个品牌质量好?盘点当下最值得买的4款洗地机型号推荐
  • 09. 【Linux教程】ls 查看文件和目录列表
  • 【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]
  • uniapp 高德地图显示
  • RabbitMQ 部署指南
  • Java轻量级稀疏矩阵求解SparseLU4J
  • Matomo 访问图形显示异常
  • Linux内核与驱动面试经典“小”问题集锦(1)
  • Ubuntu server如何使用 Daphne + Nginx + supervisor部署 Django
  • MySQL运维实战(5.3) MySQL数据乱码的一些情况
  • 过来人的经验告诉你:程序员去外包与自研公司的区别
  • 计算机视觉中的目标跟踪
  • Linux驱动 SPI子系统
  • mysql-FIND_IN_SET查询优化
  • 从编程中理解:大脑的并行处理与多任务