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

判断是不是二叉搜索树(C++)

目录

1 问题描述

1.1 示例1

1.2 示例2

2 解题思路

3 代码实现

4 代码解析

4.1 中序遍历函数 inorder

4.2 主函数 isValidBST 初始化及中序遍历调用 

4.3 检查数组中元素是否严格递增

4.4 返回验证结果 

5 总结


1 问题描述

给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。

二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。

例:

图1

图2

数据范围:节点数量满足 1≤n≤104 1≤n≤104  ,节点上的值满足 −231≤val≤231−1 −231≤val≤231−1 

1.1 示例1

输入:

{1,2,3}

返回值:

false

说明:

如题面图1 

1.2 示例2

输入:

{2,1,3}

返回值:

true

说明:

如题面图2 

2 解题思路

首先利用二叉搜索树中序遍历后节点值为升序的特点,将树中的所有节点通过中序遍历存入一个数组,然后遍历该数组检查是否严格递增。如果发现任意相邻两个数不满足前小于后的关系,则说明该树不是有效的二叉搜索树;否则,返回true证明该树满足BST的性质。

3 代码实现

    bool isValidBST(TreeNode* root) {
        // write code here
        vector<int> ans;
        inorder(root, ans);

        for(int i = 1; i < ans.size(); i++)
        {
            if(ans[i-1] > ans[i]) return false;
        }

        return true;
    }

    void inorder(TreeNode* node, vector<int> &ans) {
        if (node == nullptr) return;
        inorder(node->left, ans);
        ans.push_back(node->val);
        inorder(node->right, ans);
    }

4 代码解析

4.1 中序遍历函数 inorder

void inorder(TreeNode* node, vector<int> &ans) {
    if (node == nullptr) return;
    inorder(node->left, ans);
    ans.push_back(node->val);
    inorder(node->right, ans);
}

使用递归实现中序遍历(左-根-右)的方式遍历二叉树,将节点值依次存入传入的数组中。若当前节点为空,则直接返回,不做任何操作。

4.2 主函数 isValidBST 初始化及中序遍历调用 

bool isValidBST(TreeNode* root) {
    vector<int> ans;
    inorder(root, ans);
    // 后续验证步骤

 首先定义一个空的数组 ans,然后调用 inorder 函数对整个二叉树进行中序遍历,收集所有节点的值。

4.3 检查数组中元素是否严格递增

    for(int i = 1; i < ans.size(); i++) {
        if(ans[i-1] > ans[i]) return false;
    }

遍历存有节点值的数组 ans,依次比较相邻两个元素。由于二叉搜索树中序遍历结果应为严格递增,若前一个数大于后一个数,则说明该树不满足二叉搜索树的要求,立即返回 false

4.4 返回验证结果 

    return true;
}

如果遍历完数组没有发现逆序的情况,则说明所有节点值均满足严格递增的条件,函数最终返回 true,表示该树是一个有效的二叉搜索树。 

5 总结

本文总结了如何判断一棵二叉树是否为有效的二叉搜索树。文章首先描述了问题的要求,即左子树节点值需小于根节点、右子树节点值需大于根节点。接着,介绍了利用中序遍历特性(遍历结果为严格递增序列)来验证BST性质的方法:先通过递归中序遍历将节点值存入数组,再遍历数组检查是否严格递增。详细的代码实现和解析使读者能够清晰地理解整个解题思路和过程。

相关文章:

  • java静态变量,静态方法存储在内存中哪个位置
  • TCP怎么保证可靠传输
  • redis常用命令
  • Sublime Text 2.0.2 安装与汉化指南:从下载到中文包配置的完整教程
  • 【强化学习】第二讲——探索与利用exploration vs. exploitation
  • [WEB开发] Web基础
  • zero-shot文字分类模型
  • 【数据结构与算法】Java描述:第四节:二叉树
  • 苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
  • DeepSeek 3FS集群化部署临时笔记
  • Django中的查询条件封装总结
  • 解决 openjtalk.obj : error LNK2001: 无法解析的外部符号 __imp__PySequence_List 错误
  • C语言基础要素(016):入口条件循环:while与for
  • go 通过汇编分析栈布局和函数栈帧
  • SSM文物管理系统
  • chatgpt的一些prompt技巧
  • vue3设置全局滚动条样式
  • 1.5[hardware][day5]
  • 0CTF 2016 piapiapia 1
  • QT MVC 编程 MODEL/DELEGATE/VIEW(五)
  • 奥斯卡新规:评委必须看完影片再投票;网友:以前不是啊?
  • 美国经济萎缩意味着什么?关税政策如何反噬经济?
  • 新能源车盈利拐点:8家上市车企去年合计净利854亿元,多家扭亏
  • “80后”杨占旭已任辽宁阜新市副市长,曾任辽宁石油化工大学副校长
  • 郭向阳任广东省公安厅分管日常工作副厅长(正厅级)
  • 俄伏尔加格勒机场正式更名为斯大林格勒机场