2022年专业408的算法题

news2024/9/27 21:20:01

文章目录

  • 0 结果
  • 1 题目
  • 2 思路
  • 3 实现
    • 3.1 思路1
    • 3.2 思路二

0 结果

请添加图片描述

1 题目

在这里插入图片描述

2 思路

  • 1,首先明确二叉搜索树的定义:任何一个节点大于其左子树中的全部结点,小于其右子树中的全部结点中序遍历二叉搜索树得到一个升序序列。
  • 2,明确题目中给出的顺序存储的二叉搜索树的结点特点:根结点存储在SqBiTNode[0];当某个结点存储在SqBiTNode[i]中时,若有左孩子,则其值保存在SqBiTNode[2i+1]中,若有右孩子,保存在SqBiTNode[2i+2]中,若有双亲结点保存在SqBiTNode[(i-1)/2]中;
  • 3,
    • 3.1 思路一:(利用中序遍历搜查搜索数得到的是一个升序序列的性质)使用整型变量val(初值为负数)记录中序遍历过程中已遍历结点的最大值,若当前遍历的结点值小于等于val,则返回false;否则,将val的值更新为当前结点的值。
    • 3.2 思路二:(利用二叉搜索树的定义)从最后一个叶结点向前遍历树,判断是否满足结点与子树之间的大小关系(结点大于左子树,小于右子树),使用pmax和pmin数组分别存储右子树中结点最大值(子树中最大值)、左子树结点的最小值(子树中最小值)(比较结点值时,若是左孩子结点,使用该节点值的双亲结点值比较该结点的右子树最大值;若是右孩子结点,使用该节点值的双亲结点值比较该节点的左子树的最小值)。

注意⚠️:如果直接判断左<中<右,就会出现错误,例如下面的例子。
在这里插入图片描述

3 实现

3.1 思路1

运行二叉树T2的过程说明:

  • 1,首先执行语句1(前提:k:0,val:-1);
  • 2,执行语句2(结果:k:1,val:-1)【栈:2】;
  • 3,执行语句1(前提:k:1, val:-1,bt.SqBiTNode[k]:-1);
  • 4,执行语句2(结果:k:3, val:-1,bt.SqBiTNode[k]:-1)【栈:2, 2】;
  • 5,执行语句1(前提:k:3,val:-1)
  • 6,执行语句6(前提:k:3,val:-1);
  • 7,执行语句3(前提:k:1,val:-1)【栈:2】;
  • 8,执行语句4(前提:k:1,val:-1,bt.SqBiTNode[k]:50);
  • 9,执行语句5(结果:k:4val:50)【栈:2,5】;
  • 10,执行语句1(前提:k:4,val:50);
  • 11,执行语句2(结果:k:9,val:50)【栈:2,5,2】;
  • 12 ,执行语句1(前提:k:9,val:50);
  • 13,执行语句6(前提:k:9,val:50);
  • 14,执行语句2(前提:k:4,val:50)【栈:2,5】;
  • 15,执行语句3(前提:k:4,val:50,bt.SqBiTNode[k]:30,不满足条件);
  • 16,执行语句7(前提:k:4,val:50);
  • 17,执行语句5(前提:k:1,val:50)【栈:2】;
  • 18,执行语句7(前提:k:1,val:50);
  • 19,执行语句2(前提:k:0,val:50)【栈:】;
  • 20,执行语句7(前提:k:0,val:50,返回false);
#include<iostream>
#include <vector>
const int MAX_SIZE = 11;//T1:10;T2:11

typedef struct {
    int SqBiTNode[MAX_SIZE];
    int ElemNum;
}SqBiTree;


bool judgeInOrderBST(SqBiTree bt, int k, int *val){//初始时,k为0;使用val的地址,是为了在每次递归时更新val值
    if(k < bt.ElemNum && bt.SqBiTNode[k] != -1){//遍历树中每个非空结点【语句1】
        if(!judgeInOrderBST(bt, 2*k + 1, val)) return false;//如果有一个结点不满足升序条件,则返回false【语句2】
        if(bt.SqBiTNode[k] <= *val) return false;//与之前保存的元素比较【语句3】
        *val = bt.SqBiTNode[k];//中序遍历,更新val的值为当前结点的值【语句4】
        if(!judgeInOrderBST(bt, 2*k + 2, val)) return false;//【语句5】
    }
    return true;//语句6】
	//【语句7】
}

int main(){

    SqBiTree bt;

    //创建二叉树T1
//    bt.ElemNum = 10;
//    bt.SqBiTNode[0] = 40;
//    bt.SqBiTNode[1] = 25;
//    bt.SqBiTNode[2] = 60;
//    bt.SqBiTNode[3] = -1;
//    bt.SqBiTNode[4] = 30;
//    bt.SqBiTNode[5] = -1;
//    bt.SqBiTNode[6] = 80;
//    bt.SqBiTNode[7] = -1;
//    bt.SqBiTNode[8] = -1;
//    bt.SqBiTNode[9] = 27;

    //创建二叉树T2
    bt.ElemNum = 11;
    bt.SqBiTNode[0] = 40;
    bt.SqBiTNode[1] = 50;
    bt.SqBiTNode[2] = 60;
    bt.SqBiTNode[3] = -1;
    bt.SqBiTNode[4] = 30;
    bt.SqBiTNode[5] = -1;
    bt.SqBiTNode[6] = -1;
    bt.SqBiTNode[7] = -1;
    bt.SqBiTNode[8] = -1;
    bt.SqBiTNode[9] = -1;
    bt.SqBiTNode[10] = 35;

    int val = -1;
    std::string res = judgeInOrderBST(bt, 0, &val)?"是":"否";
    std::cout<<"判断是否是二叉搜索树:"<<res;
    return 0;
}

3.2 思路二

#include<iostream>
#include <vector>
const int MAX_SIZE = 11;//T1:10;T2:11

typedef struct {
    int SqBiTNode[MAX_SIZE];
    int ElemNum;
}SqBiTree;


bool judgeInOrderBST(SqBiTree bt, int k, int *val){//初始时,k为0;使用val的地址,是为了在每次递归时更新val值
    if(k < bt.ElemNum && bt.SqBiTNode[k] != -1){//遍历树中每个非空结点
        if(!judgeInOrderBST(bt, 2*k + 1, val)) return false;//如果有一个结点不满足升序条件,则返回false
        if(bt.SqBiTNode[k] <= *val) return false;//与之前保存的元素比较
        *val = bt.SqBiTNode[k];//更新val的值为当前结点的值
        if(!judgeInOrderBST(bt, 2*k + 2, val)) return false;
    }
    return true;
}

bool judgeBST(SqBiTree bt){
    int k, m, *pmax, *pmin;
    pmin = new int[bt.ElemNum];//或者pmin = (int*) malloc(sizeof (int) * bt.ElemNum);
    pmax = new int[bt.ElemNum];
    for (k = 0; k < bt.ElemNum; k++) {//初始化辅助数组
        pmin[k] = pmax[k] = bt.SqBiTNode[k];
    }
    for(k = bt.ElemNum -1; k > 0;k--){//从最后一个结点向根结点遍历
        if(bt.SqBiTNode[k] != -1){
            m=(k-1)/2;//双亲结点
            if(k % 2 == 1 && bt.SqBiTNode[m] > pmax[k]){//左孩子;双亲结点值大于右孩子最大值
                pmin[m] = pmin[k];
            }else if(k % 2 == 0 && bt.SqBiTNode[m] < pmin[k]){//右孩子;双亲结点值小于左孩子最大值
                pmax[m] = pmax[k];
            }else{
                return false;
            }
        }
    }
    return true;
}

int main(){

    SqBiTree bt;

    //创建二叉树T1
//    bt.ElemNum = 10;
//    bt.SqBiTNode[0] = 40;
//    bt.SqBiTNode[1] = 25;
//    bt.SqBiTNode[2] = 60;
//    bt.SqBiTNode[3] = -1;
//    bt.SqBiTNode[4] = 30;
//    bt.SqBiTNode[5] = -1;
//    bt.SqBiTNode[6] = 80;
//    bt.SqBiTNode[7] = -1;
//    bt.SqBiTNode[8] = -1;
//    bt.SqBiTNode[9] = 27;

    //创建二叉树T2
    bt.ElemNum = 11;
    bt.SqBiTNode[0] = 40;
    bt.SqBiTNode[1] = 50;
    bt.SqBiTNode[2] = 60;
    bt.SqBiTNode[3] = -1;
    bt.SqBiTNode[4] = 30;
    bt.SqBiTNode[5] = -1;
    bt.SqBiTNode[6] = -1;
    bt.SqBiTNode[7] = -1;
    bt.SqBiTNode[8] = -1;
    bt.SqBiTNode[9] = -1;
    bt.SqBiTNode[10] = 35;

    //方法1
    //int val = -1;
    //std::string res = judgeInOrderBST(bt, 0, &val)?"是":"否";
    //方法2
    std::string res = judgeBST(bt)?"是":"否";
    std::cout<<"判断是否是二叉搜索树:"<<res;
    return 0;
}

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

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

相关文章

【微信小程序入门到精通】— 微信小程序实现多页面切换(tabBar)

目录前言一、tabBar 介绍二、实操&#xff08;创建 tabBar &#xff09;2.1 基本配置2.2 详细配置总结前言 对于目前形式&#xff0c;微信小程序是一个热门&#xff0c;那么我们该如何去学习并且掌握之后去做实际项目呢&#xff1f; 为此我特意开设此专栏&#xff0c;在我学习的…

mysql索引机制实现及自适应hash索引

一、介绍   哈希&#xff08;hash&#xff09;是一种非常快的查找方法&#xff0c;一般情况下查找的时间复杂度为O&#xff08;1&#xff09;。常用于连接&#xff08;join&#xff09;操作&#xff0c;如Oracle中的哈希连接&#xff08;hash join&#xff09;。 InnoDB存储…

canopen11-sdo-40读取命令

源码 参考文件 1、SDO介绍 就对象而言,主机要访问节点词典的数据,因此主机是client客户端,节点是server服务器。上传与下载是对服务器来说的(这点和常识有点不太一样)。因此,上传指的是服务器发送数据给客户端,下载是客户端给服务器数据。 我们这里要用主机访问节点服…

Linux多进程编程之exec函数族使用

Linux多进程编程之exec函数族使用1.exec函数族是什么2.execl函数具体使用3.execlp4.exec后面不同字母所代表的含义1.exec函数族是什么 顾名思义&#xff0c;它并不只是一个函数&#xff0c;而是以exec开头的六个函数&#xff0c;并且是没有exec这个函数的&#xff08;就像TCP/…

几行代码演示linux kernel、libc、userSpace app的关系

问一&#xff1a;编译出来的Linux内核镜像(".\build\arch\arm64\boot\Image")&#xff0c;可以单独运行吗&#xff1f;答案是能&#xff0c;但是加载完就提示panic&#xff0c;然后死掉了。 原因是&#xff1a; 内核代码加载完后&#xff0c;一定要切换到低权限模式…

Wireshark TS | Packet Challenge 之 HTTP 案例分析

前言 来自于 Sharkfest Packet Challenge 中的一个数据包案例&#xff0c;Sharkfest 是 Wireshark 官方组织的一年一度的大会&#xff0c;致力于在 Wireshark 开发人员和用户社区之间分享知识、经验和最佳实践。印象中早期是一年一次&#xff0c;近几年发展成一年两次&#xf…

我的2022年终总结

目录 1 序 1 2 工作 1 3 业余 1 3.1 AI 1 3.2 数学小插曲 3 3.3 金融投资 3 4 生活 4 5 最后 4 1 序 老婆大人每年这个时候都要写年终总结&#xff0c;现在也正在写&#xff1b;CSDN也发起了年终征文活动&#xff1b;各大app也各种年度大数据总结。我好像还是第一次写年终总…

两两交换链表中的节点 -- 虚拟头节点

24两两交换链表中的节点 – 虚拟头节点 通过本题可以&#xff1a; 增加对虚拟头节点的理解。 加强对链表这一基本数据结构的基本操作的理解。 1. 交换过程&#xff1a; 如图&#xff0c;假设链表如图所示。 为了减少对头节点的单独讨论&#xff0c;这里采用虚拟头节点进行…

Allegro如何显示走线和铜皮的网络名操作指导

Allegro如何显示走线和铜皮的网络名操作指导 在做PCB设计的时候,如果可以实时看到走线和铜皮的网络名,对于设计有很大帮助,如下图 具体操作如下 选择Set-up-user preferences选择Display

Vue 总结一(简介 基本语法)

目录 Vue 是什么 与其它 JS 框架的关联 Vue 周边库 MVVM模型 怎么用 Vue模板语法有2大类&#xff1a; 数据绑定 data 事件 v-on methods 计算属性 computed 监视属性 watch computed和watch之间的区别&#xff1a; 条件渲染 v-if v-show Vue 是什么 一个动态构建用…

sql根据团队树一级一级汇总统计

1、需求描述 最近碰到了一个需求&#xff0c;是要统计各个团队的员工的销售金额&#xff0c;然后一级一级向上汇总。 架构团队树是类似于这种样子的&#xff0c;需要先算出每个员工的销售金额&#xff0c;然后汇总成上一级的团队金额&#xff0c;然后各个团队的销售总金额再往上…

京东技术发展简史

文章目录前言京东发展历程京东商城技术的演进京东自研技术分布式数据库StarDB京东云移动端Flutter在京东的实践大数据咚咚架构ShardingSphere京东人物参考“京东可以高速发展到今天的规模的原因&#xff0c;其中最核心的是坚持“倒三角”战略&#xff1a;建立出色的团队&#x…

转义字符与strlen(),sizeof()在一起的注意事项

转义字符与strlen(),sizeof() 1. 转义字符每个人都知道是怎么一回事儿&#xff0c;转义字符顾名思义就是转变意思。 2. 首先转义字符肯定是一个字符&#xff0c;不是两个字符&#xff0c;更不用说是数字了&#xff0c;就是字符。 3. 当用strlen()统计字符串长度时或者用sizeo…

2022年度回顾

这一年是不平凡的一年&#xff0c;换了公司&#xff0c;新公司频繁出差&#xff0c;去了临沂&#xff0c;去了河南&#xff0c;去了唐山&#xff0c;去了福鼎&#xff0c;当中最印象深刻的还是河南&#xff0c;项目万分火急&#xff0c;在疫情隔绝的10月份毅然决然的前往河南安…

如何稍微优雅滴完成博文访问计数[SpringBoot+redis+分布式锁]

文章目录前言背景朴素做法Redis方案流量统计接口演示自定义注解计数实现防刷加锁完整代码数据一致性分析自定义注解返回值分析解决方案总结前言 okey,我们来收尾一下&#xff0c;这公历纪年2022年12月31日。这是本年度的最后一篇博文。那么这篇博文主要是用来实现博文的一个访…

【LeetCode】被围绕的区域 [M](深度优先遍历)

130. 被围绕的区域 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&#xff1a;board [[&quo…

浅谈Flink批模式Adaptive Hash Join

Flink批Hash Join递归超限问题 随着Flink流批一体能力的迅速发展以及Flink SQL易用性的提升&#xff0c;越来越多的厂商开始将Flink作为离线批处理引擎使用。在我们使用Flink进行大规模join操作时&#xff0c;也许会发生如下的异常&#xff0c;导致任务失败&#xff1a; Hash j…

Es进阶检索

本文用到的测试数据及所有代码链接&#xff1a; https://blog.csdn.net/m0_62436868/article/details/128505566?spm1001.2014.3001.5501 1、SearchAPI ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数&#xff08;uri检索参数&#xff09; 另…

基于华为eNSP的中小企业办公园区网络规划与设计

目录一、需求分析&#xff08;一&#xff09;项目背景&#xff08;二&#xff09;网络业务需求&#xff08;三&#xff09;网络应用需求二、网络结构设计三、网络拓扑图四、网络设备基本配置五、项目测试结语运用到的技术有&#xff1a; 1、虚拟局域网&#xff08;VLAN&#xf…

人工智能--你需要知道的一切

人工智能--你需要知道的一切 人工智能是当今最受关注的技术之一。但它究竟是什么&#xff1f;你为什么要关心&#xff1f; 人工智能是当今最受关注的技术之一。但它到底是什么&#xff1f;你为什么要关心&#xff1f;在这里&#xff0c;我们将介绍你需要知道的关于人工智能的…