【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

news2024/11/15 23:24:43

Index

    • 真题题目
    • 分析实现
    • 总结

真题题目

已知非空二叉树T的结点值均为正整数,采用顺序存储方式保存,数据结构定义如下:

typedef struct {                // MAX_STZE为已定义常量
    int SqBiTNode[MAX_SIZE];    // 保存二叉树结点值的数组
    int ElemNum;                // 实际占用的数组元素个数
} SqBiTree;

T中不存在的结点在数组SqBiTNode中用 -1 表示。例如,对于下图所示的两棵非空二叉树T1和 T2,
在这里插入图片描述
T1的存储结果如下:
在这里插入图片描述
T2的存储结果如下:
在这里插入图片描述
请设计一个尽可能高效的算法,判定一棵采用这种方式存储的二叉树是否为二叉搜索树,若是,则返回true,否则,返回false。要求:

  1. 给出算法的基本设计思想。
  2. 根据设计思想,采用C或 C++语言描述算法,关键之处给出注释。

(本文重点关注算法实现及思路分析,不含具体答题表述)

分析实现

首先,本题的思想与判断二叉树是否是BST相同,重点在于理解对于顺序存储这一点进行二叉树的基本操作。

由题例可知,最后一个叶结点前的空结点会用 -1 占位,而将 -1 也看作结点,就得到了完全二叉树。
对于完全二叉树的顺序存储有如下结论:结点[x]的左孩子为结点[2x+1],右孩子为结点[2x+2]。运行这一结论就可以实现访问子结点的操作;

对于判断子结点是否为空,则需要考虑两个方面:
_1. 当前下标x是否小于结点个数T.ElemNum
_2. 当前下标位置的元素[x]是否为 -1。

当确定了基本操作的实现后,本题就和判断二叉树是否是BST没有什么区别了,作为学习参考,此处采用中序遍历实现判断BST的工具函数。具体实现如下:

// 判断BST工具函数
bool judgeBSTUtil(SqBiTree& bt, int cur, int& preV){
    // 若cur为空结点
    if(cur>=bt.ElemNum || bt.SqBiTNode[cur]==-1) 
        return true;
        
    // 判断左子树
    if(!judgeBSTUtil(bt, 2*cur+1, preV)) 
        return false;
        
    // 判断当前结点
    if(bt.SqBiTNode[cur]<=preV) 
        return false;

    // 判断右子树
    preV=bt.SqBiTNode[cur];
    if(!judgeBSTUtil(bt, 2*cur+2, preV)) 
        return false;

    return true;
}

// 判断BST
bool judgeBST(SqBiTree& bt){
	int minV = INT_MIN;
    return judgeBSTUtil(bt, 0, minV);
}

总结

以上就是利用中序遍历判断顺序存储的二叉树是否为BST的实现,相较于先序遍历中每次传递minmax,以判断cur的值是否在(min, max)内;
中序遍历只需以引用方式传递preV,判单cur的值是否大于preV即可。

本题重点在于面对顺序存储的二叉树,通过结论实现基础操作,并合理运用解题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BM3D--Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering

系列文章目录 文章目录 系列文章目录前言稀疏三维变换域协同滤波图像去噪摘要1 引言2 分组和协作过滤A.分组B.按匹配分组C.协同过滤D.基于变换域收缩的协同过滤 3 算法结论 前言 论文地址 如果下载不了可以从 https://download.csdn.net/download/m0_70420861/89708940 获取 …

Pytorch安装 CUDA Driver、CUDA Runtime、CUDA Toolkit、nvcc、cuDNN解释与辨析

Pytorch的CPU版本与GPU版本 Pytorch的CPU版本 仅在 CPU 上运行&#xff0c;适用于没有显卡或仅使用 CPU 的机器。安装方式相对简单&#xff0c;无需额外配置 CUDA 或 GPU 驱动程序。使用方式与 GPU 版相同&#xff0c;唯一不同的是计算将自动在 CPU 上进行。 Pytorch的GPU版…

VBA学习(63):Excel VBA 数据分析展示/ListView控件/Combox组合框控件/CheckBox复选框控件/科目汇总表

前面我们分享了使用ListVeiw进行数据展示&#xff0c;做出“科目汇总表”来&#xff08;Excel VBA 数据分析展示/ListView控件、Excel VBA 数据分析展示/ListView控件/Combox组合框控件/科目汇总表(2)&#xff09;&#xff0c;今天&#xff0c;我们继续完善按月查询、按一级科目…

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释 问题描述第一个奇怪的bug&#xff1a;新建的工程没有SoftMotion General Axis Pool选项第二个奇怪的bug&#xff1a;在新建工程SoftMotion General Axis Pool选项时&#xff0c;无法手动添加第三个奇怪的bug&#xff1a;虚…

Spring源码之refresh

1.refesh的核心介绍 在 Spring 框架中&#xff0c;refresh 主要用于刷新应用上下文。这一过程涉及多个重要的步骤&#xff0c;确保 Spring 容器的状态更新、bean 的加载以及资源的初始化。 refresh 方法的主要功能 初始化上下文&#xff1a; refresh 方法会初始化应用上下文&…

【项目实战】智能机械臂协同视觉辅助仓储物流管控平台

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

9月4日星期三今日早报简报微语报早读

9月4日星期三&#xff0c;农历八月初二&#xff0c;早报微语早读。 1、全球第二批100个地质遗产地公布&#xff0c;中国乌海、自贡、桂林等3地入选&#xff1b; 2、我国科学家在超高纯石墨领域取得重大突破&#xff1b; 3、2024上海百强企业榜单发布&#xff1a;入围门槛105…

小土堆pytorch

anaconda安装 pip list 可以看有哪些package包 nvidia-smi查看显卡的状态 安装pytorch 检验pytorch是否安装成功&#xff0c;以及是否pytorch是否可以使用gpu。 (1)查看conda版本 conda --version 或 conda -V (2)更新conda&#xff08;将conda自身更新到最新版本&#xff09; …

算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合

文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ …

Flink问题记录

尚硅谷Flink1.17问题记录 上手pom依赖循环递归WordCountStreamDemo中readTextFile是deprecated&#xff08;强烈反对的&#xff09; 上手 pom依赖循环递归 pom依赖中&#xff1a; <dependency><groupId>org.apache.flink</groupId><artifactId>flink…

J.U.C Review - 线程池原理/源码解析

文章目录 为什么要使用线程池ThreadPoolExecutor构造方法解析常见的阻塞队列实现及其特性阻塞队列在实际应用中的适用场景分析自定义ThreadFactory和RejectedExecutionHandler实际使用中的示例与代码片段 线程池的状态线程池的任务处理流程线程复用的实现四种常见的线程池newCa…

uniapp 自定义微信小程序 tabBar 导航栏

背景 做了一个校园招聘类小程序&#xff0c;使用 uniapp vue3 uview-plus pinia 构建&#xff0c;这个小程序要实现多角色登录&#xff0c;根据权限动态切换 tab 栏文字、图标。 使用pages.json中配置tabBar无法根据角色动态配置 tabBar&#xff0c;因此自定义tabBar&…

达梦数据库的系统视图v$ifun

达梦数据库的系统视图v$ifun 达梦数据库&#xff08;DM Database&#xff09;中V$IFUN 视图是用于检测函&#xff08;Function&#xff09;信息的。 在 Oracle 数据库中&#xff0c;类似的系统视图被称为动态性能视图&#xff0c;但在达梦数据库中并没有与 Oracle 一一对应的…

QT(1)-.pro 文件 转成.vcxproj 工程

1.qtcreator创建的文件转换成vs2019可以打开的。 1.QT webenginewidgets unknown modules webenginewidgets 要用 MSVC2017 &#xff0c;用minGW 32构建

使用Django身份验证系统

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django 5框…

windows中Selenium安装最新版Chrome WebDriver

windows中Selenium安装最新版Chrome WebDriver 需求&#xff1a;需要使用 selenium 对某个网页进行截图 文章目录 windows中Selenium安装最新版Chrome WebDriver一、查看Chrome版本二、找到对应的chromedriver版本三 安装3.1 确定google安装路径3.2 将下载的google driver 解压…

解决bug: RuntimeError: Address already in use,一个linux下pytorch多卡训练tcp端口占用的bug

时间&#xff1a;2024.9.3 1&#xff09;bug&#xff1a; self._store TCPStore( # type: ignore[call-arg] RuntimeError: Address already in use2&#xff09;原因分析 linux下pytorch多卡训练深度学习模型&#xff0c;训练中途暂停训练&#xff0c;但仍有进程占用某个端…

字典树Trie(专项复习)

一.P8306 【模板】字典树 题目思路:字典树的板子题,熟练写出insert函数(建树),以及query函数(查询)即可. 代码实现: #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; typedef long long ll; #define N 3000005 #define P 131 ll f1[N]; s…

华为云征文|Flexus云服务X实例安装ODBC驱动,在ODBC中建立MySQL数据库连接,通过QT连接云数据库

引出 4核12G-100G-3M规格的Flexus X实例使用测评第2弹&#xff1a;Flexus云服务X实例安装ODBC驱动&#xff0c;在ODBC中建立MySQL数据库连接&#xff0c;通过QT连接云数据库 什么是Flexus云服务器X实例 官方解释&#xff1a; Flexus云服务器X实例是新一代面向中小企业和开发…

第140天:内网安全-横向移动局域网ARP欺骗DNS劫持钓鱼中间人单双向

目录 案例一&#xff1a;局域网&工作组-ARP原理-断网限制-单向 案例二&#xff1a;局域网&工作组-ARP欺骗-劫持数据-双向 案例三&#xff1a;局域网&工作组-DNS 劫持-钓鱼渗透-双向 案例一&#xff1a;局域网&工作组-ARP原理-断网限制-单向 原理&#xff1…