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

⭐算法OJ⭐判断二叉搜索树【树的遍历】(C++实现)Validate Binary Search Tree

图论入门【数据结构基础】:什么是树?如何表示树?

之前我们有分别讲解二叉树的三种遍历的相关代码实现:
⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal

二叉树的三种遍历【树的遍历】(C++实现)Binary Tree Traversal

二叉搜索树(BST)有一个非常重要的性质:中序遍历的结果是一个严格递增的序列。 如果对一棵二叉搜索树进行中序遍历(Inorder Traversal),得到的节点值的序列一定是从小到大严格递增的。

什么是中序遍历?

中序遍历是一种遍历二叉树的方式,顺序是:

  • 遍历左子树。
  • 访问根节点。
  • 遍历右子树。

为什么 BST 的中序遍历是严格递增的?

二叉搜索树的定义是:

  • 左子树的所有节点的值都小于根节点的值。
  • 右子树的所有节点的值都大于根节点的值。
  • 左右子树也必须是二叉搜索树。

根据这个定义,中序遍历的过程会先访问左子树(较小的值),然后访问根节点(中间的值),最后访问右子树(较大的值)。因此,遍历的结果一定是严格递增的。

举个例子

假设有一棵二叉搜索树:

      4
     / \
    2   5
   / \
  1   3

对这棵树进行中序遍历:

  • 遍历左子树 2:
    • 遍历左子树 1,访问 1。
    • 访问 2。
    • 遍历右子树 3,访问 3。
  • 访问根节点 4。
  • 遍历右子树 5,访问 5。
  • 最终的中序遍历结果是:[1, 2, 3, 4, 5],这是一个严格递增的序列。

如何利用这个性质?

我们可以利用中序遍历的结果来判断一棵树是否是二叉搜索树:

  • 对树进行中序遍历,记录遍历的结果。
  • 检查遍历结果是否是严格递增的。
    • 如果是,则说明这是一棵二叉搜索树。
    • 如果不是,则说明这不是一棵二叉搜索树。

98. Validate Binary Search Tree

Given the root of a binary tree, determine if it is a valid binary search tree (BST).

A valid BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node’s key.
  • The right subtree of a node contains only nodes with keys greater than the node’s key.
  • Both the left and right subtrees must also be binary search trees.

A subtree of treeName is a tree consisting of a node in treeName and all of its descendants.

Example 1:
在这里插入图片描述

Input: root = [2,1,3]
Output: true

Example 2:
在这里插入图片描述

Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.

C++ 实现

bool isValidBST(TreeNode* root) {
    vector<int> inorder;
    inorderTraversal(root, inorder); // 中序遍历
    for (int i = 1; i < inorder.size(); i++) {
        if (inorder[i] <= inorder[i-1]) { // 检查是否严格递增
            return false;
        }
    }
    return true;
}

void inorderTraversal(TreeNode* node, vector<int>& result) {
    if (node == nullptr) return;
    inorderTraversal(node->left, result); // 遍历左子树
    result.push_back(node->val);         // 访问根节点
    inorderTraversal(node->right, result); // 遍历右子树
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的节点数,每个节点被访问一次。
  • 空间复杂度:
    • 递归解法: O ( n ) O(n) O(n),递归栈的深度。
    • 迭代解法: O ( n ) O(n) O(n),栈的空间。

相关文章:

  • 算法-最大公约数
  • 计算机二级(MS Office高级应用)知识点总结
  • 轴承的结构参数以及特征频率的计算
  • Transformer中,Fisher矩阵与权重之间关系
  • linux命令行工具进阶
  • HTTP状态码全解析
  • kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署
  • 基于概率图模型的蛋白质功能预测
  • 河南大学数据库实验6
  • 【leetcode题解】链表
  • 【STL】string类
  • SDH(Synchronous Digital Hierarchy,同步数字体系)
  • 如何使用SQL进行多表联合查询(SQLⅰte举例)
  • 爬虫:scrapy面试题大全(60个scrapy经典面试题和详解)
  • Linux作业2——有关文件系统权限的练习
  • CTF【WEB】学习笔记1号刊
  • 【Jwt】详解认证登录的数字签名
  • 缓存设计模式
  • C语言-发布订阅模式详解与实践
  • 【Go】Go语言继承-多态模拟
  • 莫名的硝烟|“我们最好记住1931年9月18日这个日子”
  • 是否进行了及时有效处置?伤者情况如何?辽阳市相关负责人就饭店火灾事故答问
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升
  • 游客曝九寨沟打网约车被出租车围堵,官方:前者违规,后者做法不对
  • 今年一季度全国城镇新增就业308万人,就业形势保持总体稳定
  • 上海74岁老人宜春旅游时救起落水儿童,“小孩在挣扎容不得多想”