【leetcode100-042/043】【二叉树】二叉搜索树的转换和验证

【转换】

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

思路:

可以说是递归板子题了。每次把数组切两半,中间数据拿来做根节点,左边部分继续建左子树,右边部分继续建右子树,只需要注意更改传入的参数就好啦。

class Solution {
public:
    TreeNode* makeTree(vector<int>& nums,int l, int r){
        if(l>r) return nullptr;
        int mid=(l+r)/2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left=makeTree(nums,l,mid-1);
        root->right=makeTree(nums,mid+1,r);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return makeTree(nums,0,nums.size()-1);
    }
};

【验证】

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

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

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

思路:

一开始写了个经典错误版,也就是在判断环节只验证了左右孩子和父节点的关系是否合法,但我们要的其实是左子树所有节点都必须合法。

为此我们引入一个上下界的概念。通过传参实时地限定当前子树中所有节点的合法取值范围。

显然,对某个节点的左子树来说,其下界和以该节点为根节点的整个二叉树是相同的,而其上界则是该节点自身的值,右子树同理,只是改变的是下界。

虽说是整个子树的上下界,但我们只要检查左右孩子就可以,因为递归函数会帮助我们检查到所有的节点,而越小的子树其上下界范围只会越严格,所以不可能出现某节点在小子树时合法而在更大的子树中非法的情况。

class Solution {
public:
    bool check(TreeNode* root, long long lower, long long upper) {
        if (root == nullptr)
            return true;
        return (root->val > lower) && (root->val < upper) &&
               check(root->left, lower, root->val) &&
               check(root->right, root->val, upper);
    }
    bool isValidBST(TreeNode* root) { return check(root, LONG_MIN, LONG_MAX); }
};

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 14:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 14:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 14:36:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 14:36:01       20 阅读

热门阅读

  1. springboot 集成websocket

    2024-01-20 14:36:01       34 阅读
  2. 记录 | 修改.gitignore文件,如何重新生效

    2024-01-20 14:36:01       36 阅读
  3. 深度解析window.history.go()和history.back()

    2024-01-20 14:36:01       33 阅读
  4. windows 利用DDNS-GO解析IPV6

    2024-01-20 14:36:01       42 阅读
  5. Todo List 变成 Contribution List

    2024-01-20 14:36:01       31 阅读
  6. C++:史上最坑小游戏

    2024-01-20 14:36:01       32 阅读
  7. Unity音频管理器

    2024-01-20 14:36:01       31 阅读
  8. QML与C++交互详解

    2024-01-20 14:36:01       34 阅读
  9. excel 常用函数

    2024-01-20 14:36:01       35 阅读
  10. 2024 前端高频面试题之 Vue 篇

    2024-01-20 14:36:01       28 阅读
  11. 126 对称的二叉树

    2024-01-20 14:36:01       21 阅读
  12. Spring中的IOC与AOP的理解(1)

    2024-01-20 14:36:01       32 阅读
  13. Go 常见报错 - VsCode运行go:go.mod file not found

    2024-01-20 14:36:01       31 阅读
  14. redisson-spring-boot-starter 自动化配置源码解析

    2024-01-20 14:36:01       29 阅读