是否二叉搜索树

2023-10-26

习题4.3 是否二叉搜索树 (25分)

本题要求实现函数,判断给定二叉树是否二叉搜索树。

函数接口定义:

bool IsBST ( BinTree T );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树:

定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:

  • 非空左子树的所有键值小于其根结点的键值。
  • 非空右子树的所有键值大于其根结点的键值。
  • 左、右子树都是二叉搜索树。

如果T是二叉搜索树,则函数返回true,否则返回false。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef enum { false, true } bool;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree BuildTree(); /* 由裁判实现,细节不表 */
bool IsBST ( BinTree T );

int main()
{
    BinTree T;

    T = BuildTree();
    if ( IsBST(T) ) printf("Yes\n");
    else printf("No\n");

    return 0;
}
/* 你的代码将被嵌在这里 */

输入样例1:如下图

在这里插入图片描述

输出样例1:

Yes

输入样例2:如下图

在这里插入图片描述

输出样例2:

No

作者: DS课程组
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB


思路

根据二叉搜索树的定义,需要注意可以为空。如果非空,非空左子树的所有键值小于其根结点的键值,右子树同理,且其左右子树都是二叉搜索树。
重点是如何保证非空左子树的所有键值小于其根节点的键值,若每一结点的左儿子均小于父结点,右儿子均大于父结点,则左子树最大结点为左子树最右结点,所以只要判断左子树最右结点是否小于根结点就可以了,右子树同理。

代码

bool IsBST ( BinTree T ){
    if(!T)//空树
        return true;
    if(T->Left){//左子树非空
        if(T->Left->Data>=T->Data)//左子结点
            return false;
        BinTree Tleft;
        Tleft=T->Left;
        while(Tleft->Right)
            Tleft=Tleft->Right;
        if(Tleft->Data>=T->Data)//左子树最右结点
            return false;
        if(!IsBST(T->Left))//判断左子树
            return false;
    }
    if(T->Right){
        if(T->Right->Data<=T->Data)
            return false;
        BinTree Tright;
        Tright=T->Right;
        while(Tright->Left)
            Tright=Tright->Left;
        if(Tright->Data<=T->Data)
            return false;
        if(!IsBST(T->Right))
            return false;
    }
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否二叉搜索树 的相关文章

  • 用nginx Rtmp Module自建直播服务器

    下载源码 首先准备好源码和常用编译工具 gcc之类的 mkdir opt git 这里我偷懒直接把源码下载到这了 大家自行找地方 cd opt git git clone https github com arut nginx rtmp m
  • Java_经典算法之桶排序

    一 桶排序介绍 桶排序是计数排序的升级版 它利用了函数的映射关系 高效与否的关键就在于这个映射函数的确定 为了使桶排序更加高效 我们需要做到这两点 在额外空间充足的情况下 尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到

随机推荐

  • matlab在循环时如何跳过几个数,matlab如何得到一个数组的行数和列数, matlab判断数组的长度

    1 matlab在循环时如何跳过几个数 eg 循环输出1到10 但需要跳过5 for i 1 4 6 10 fprintf d n i end 2 matlab中如何得到数组的行数和列数 eg 创建一个2 3的0向量 并判断行数和列数 m
  • C++ const

    class A private const int a 常对象成员 可以使用初始化列表或者类内初始化 public 构造函数 A a 0 A int x a x 初始化列表 const可用于对重载函数的区分 int getValue 普通成
  • ubuntu编译caffe

    https blog csdn net weixin 42068754 article details 103386379 spm 1001 2101 3001 6661 1 utm medium distribute pc relevan
  • conda创建的虚拟环境和Pycharm创建的虚拟环境有什么区别。

    问题描述 刚开始学习深度学习时 不同项目都需要安装不同的库 有时为了方便 不同的项目就使用了独立的虚拟环境 这样在加载库时比较快一些 如果所有项目的库都安装在base下 可能会出现版本不匹配之类的问题 所以 一开始使用的conda创建的虚拟
  • 内网穿透两种方式

    一 内网穿透引入 你是否被以下问题所困扰 我想装个B让其他同学在外网访问我的程序 应该怎么办 接了个小外包 给客户演示Demo没有站点怎么办 做微信 支付宝支付等其他第三方平台的功能 没有外网回调地址 应该怎么办 内网穿透 又叫NAT穿透
  • ODOO 安装

    ODOO 安装 对初学者而言 ODOO 的安装是横在面前的第一道坎 必须过的 和几年前情况不同 最近几年 ODOO在安装方面已经大幅改进 不需要太专业的技能也能完成安装过程 下面先说说大致的安装过程 有空再补上详细的图片和步骤 准备工作 1
  • [2017年第八届真题] 分巧克力

    题目 传送门 思路 二分答案 写个check函数 对每个mid进行检查可行性 结果再检查能不能切割出k块或以上的 l l 的巧克力 不能的话 要 1 Code include
  • 七、Hadoop系统应用之搭建Hadoop高可用集群(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

    Hadoop集群搭建前安装准备参考 一 Hadoop系统应用之安装准备 一 超详细步骤指导操作 WIN10 VMware Workstation 15 5 PRO CentOS 6 7 一 Hadoop系统应用之安装准备 二 超详细步骤指导
  • 大话赛宁云

    如今 随着数字时代的飞速发展 安全漏洞存在于网络空间中 对系统造成极大的安全隐患 为网络攻击者的恶意入侵提供了捷径 对此 解决这一困境 要秉承 快速 自动 安全 的解决标准 首先需要高技术手段的支持 实施常态化演练 及时发现安全漏洞 测评危
  • 暑期必须要学习的52个Python+OpenCV实战项目

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 有个粉丝前几天问我 本人小白一枚 看了很多深度学习 机器学习以及图像处理等视频和书之后 理论有一些长进 但是实际运用能力不足 从反面也是由于理论认识不足所致 所以想问问有
  • 完整的vuejs + django 前后端分离项目实践(登录,注册,权限控制,可视化)

    完整的vuejs django 前后端分离项目实践 登录 注册 权限控制 可视化 vuejs是一个流行的前端框架 django是一个python非常流行的web框架 在某期的作业中 需要基于它两实现一个前端后分离 并且拥有权限管理的系统 声
  • 哈夫曼编码

    哈夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 哈夫曼编码是可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字 有时称之为最佳编码
  • sqlmap配置

    1 我们先去sqlmap官网上下载sqlmap的压缩包 2 把解压后的压缩包放在python27的安装路径下 这个路径指的是 然后配置环境变量 新增一个D python2 7 17 sqlmap sqlmapproject sqlmap 1
  • 感谢导师每次组会的锻炼,让我收获今年最想去的一个offer

    题解 名单中出现过的人 a input tuple1 tuple Tom Tony Allen Cydin Lucy Anna print tu 神策校园招聘来啦 你想要跟老板们扁平化相处吗 你想每天吃不完的水果零食饮品不限量吗 毕业第一份
  • 笔记-flowable工作流开启节点自动跳过

    flowable工作流开启节点自动跳过 笔记 开始 准备工作 1 flowable支持流程跳转的功能 在流程图绘画的时候可以设置一个表达式让节点自动跳过 2 在流程开启时需要设置参数 笔记 开始 我们在使用工作流时经常会遇到需要自动跳过节点
  • HTML

    HTML 下拉框和文本域 文件域 1 下拉框 在平时我们填问卷或者冲浪的时候做筛选的时候都会遇到下拉框 html写一个下拉框的方式是使用select标签 name和id是默认属性
  • Android问题集(五)——解决提示:The method **() is undefined for the type ***()

    使用情景 在非Activity子类方法中 有时想要调用Activity类特有的方法 系统会提示无该方法The method is undefined 思路 将Activity的父类Context作为方法参数 通过context调用该方法 例
  • Fckeditor常见漏洞的挖掘与利用整理汇总

    查看编辑器版本 FCKeditor whatsnew html 2 Version 2 2 版本 Apache linux 环境下在上传文件后面加个 突破 测试通过 3 Version lt 2 4 2 For php 在处理PHP 上传的
  • Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)

    这一节主要做一些修补工作 一个是 文章阅读量的统计 另一个是自动生成文章摘要内容 1 文章阅读量的统计 1 文章阅读量的统计 我们需要在model下的Post类中新加入一个views 字段用来统计文章被阅读的数量 blog models p
  • 是否二叉搜索树

    习题4 3 是否二叉搜索树 25分 本题要求实现函数 判断给定二叉树是否二叉搜索树 函数接口定义 bool IsBST BinTree T 其中BinTree结构定义如下 typedef struct TNode Position type