考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】

news2024/9/28 21:55:17

这道题很妙。题目给的二叉排序树好像没学过其实就是二叉查找树。然后这道题主要的就是思路

1.节点的初始化(记住)

struct TreeNode {
     int val;
    TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

2.节点的插入

void insert(TreeNode* &root,int x){
    //判断是插入右边还是左边
    if(!root) root = new TreeNode(x);
    if(root->val == x) return;
    if(x > root->val)   insert(root->right,x);
    else if(x < root->val)  insert(root->left,x);
}

 3.节点的删除

    1.先找到那个要删除节点所在处
    2.找到之后处理分三种情况
    删除的节点是叶节点,直接删除即可
    删除的节点只有右节点或者左节点 将左节点或者右节点删除即可
    删除的节点有右结点又有左节点,我们只需要知道Y:中序遍历排在这个节点之前的节点即可也就是这个节点左节点下最右边的节点。如果左子树只有它自己,那他就是那个Y。将Y的值赋给要删除的节点,然后就是第一种情况了将Y原先那个节点删除即可

void remave(TreeNode* &root,int x){
    if(root->val > x) remave(root->left,x);
    else if(root->val < x) remave(root->right,x);
    else{
        if(root->left==NULL && root->right ==NULL){
             root = NULL;
        }
        else if(root->left==NULL){
             root = root->right;
        }
        else if(root->right==NULL){
             root = root->left;
        }else{
             auto p = root->left;
             while(p->right) p = p->right;
             root->val = p->val;
             remave(root->left,p->val);
        }
    }
}

  4.节点的遍历(讲一个其实就可以了)

    1.现有所有数中小于x的最大的数
    2.如果此节点大于x,那就去root的左子树找(递归左子树)
    3.如果此节点小于x,那就去root的右子树找(递归右子树),但是其实这个节点很可能就是答案所以需要再递归出来的值和这个节点中找到最大值max()
    4.为了不让哪些节点为空的影响我们的判断,只要为空我们就返回最小值。

int returnPre(TreeNode* root,int x){
    if(!root) return -INF;
    if(root->val >= x) return returnPre(root->left,x);
    else if(root->val < x) return max(returnPre(root->right,x),root->val);
}
#include <iostream>
#include <algorithm>
using namespace std;
struct TreeNode {
     int val;
    TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *root;
#define INF 10001;
void insert(TreeNode* &root,int x){
    //判断是插入右边还是左边
    if(!root) root = new TreeNode(x);
    if(root->val == x) return;
    if(x > root->val)   insert(root->right,x);
    else if(x < root->val)  insert(root->left,x);
}



void remave(TreeNode* &root,int x){
    //先找到那个要删除节点所在处
    //分三种情况
    //1.删除的节点是叶节点,直接删除即可
    //2.删除的节点只有右节点或者左节点 将左节点或者右节点删除即可
    //3.删除的节点有右结点又有左节点,我们只需要知道Y:中序遍历
    //排在这个节点之前的节点即可也就是这个节点左节点下最右边的节点
    //如果左子树只有它自己,那他就是那个Y
    //将Y的值赋给要删除的节点,然后就是第一种情况了将Y原先那个节点删除即可
    if(root->val > x) remave(root->left,x);
    else if(root->val < x) remave(root->right,x);
    else{
        if(root->left==NULL && root->right ==NULL){
             root = NULL;
        }
        else if(root->left==NULL){
             root = root->right;
        }
        else if(root->right==NULL){
             root = root->left;
        }else{
             auto p = root->left;
             while(p->right) p = p->right;
             root->val = p->val;
             remave(root->left,p->val);
        }
    }
}

int returnPre(TreeNode* root,int x){
    //现有所有数中小于x的最大的数
    //如果此节点大于x,那就去root的左子树找(递归左子树)
    //如果此节点小于x,那就去root的右子树找(递归右子树),
    //但是其实这个节点很可能就是答案所以需要再递归出来的值和这个节点中找到最大值max()
    //为了不让哪些节点为空的影响我们的判断,只要为空我们就返回最小值。
    if(!root) return -INF;
    if(root->val >= x) return returnPre(root->left,x);
    else if(root->val < x) return max(returnPre(root->right,x),root->val);
}

int returnEnd(TreeNode* root,int x){
    if(!root) return INF;
    if(root->val <= x) return returnEnd(root->right,x);
    else if(root->val > x) return min(returnEnd(root->left,x),root->val);
}

int main(){
    int n;
    cin>>n;
    while(n--){
        int t,x;
        cin>>t>>x;
        if(t==1){
            insert(root,x);
        }else if(t==2){
            remave(root,x);
        }else if(t==3){
            int a = returnPre(root,x);
            cout<<a<<endl;
        }else if(t==4){
            int b = returnEnd(root,x);
            cout<<b<<endl;
        }
    }
    return  0;
}

 

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

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

相关文章

HTTPS 的加密流程

文章目录 前言一.HTTPS 是什么二."加密" 是什么四.HTTPS解决了哪些问题五.HTTPS 的工作过程对称加密非对称加密引入证书 前言 本文介绍了HTTPS的加密流程&#xff0c;以及HTTPS在保护用户数据安全和确保通信机密性方面的重要性。通过详细解释HTTPS的工作原理和加密流…

网络安全里的主要岗位有哪些?小白如何快速入门?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447; 网…

ChatGPT:世界已经永远改变了,而大多数人尚无所觉

1、你发现没有&#xff0c;现在跟朋友交流&#xff0c;言必聊ChatGPT。几乎所有人都在蹭GPT的热度&#xff0c;无论是头部企业还是普通的个人开发者&#xff0c;都想趁着ChatGPT东风狂赚一笔。有卖ChatGPT账号的、有借用ChatGPT的API集成服务让人付费试用的&#xff0c;还有人利…

Android第一代加壳技术的验证、测试和探究

Android第一代加壳测试&#xff0c;网上有很多文章&#xff0c;本文只是在前人基础上测试和验证。因此&#xff0c;本文的重点在于动手和实践。 第一代加壳技术有三个项目&#xff0c;分别是&#xff1a; 加壳程序。主要是把需要加壳的原程序加密后&#xff0c;放在壳程序中&…

全能超高清解码播放器_完美解码

哈喽&#xff0c;大家好。今天给各位小伙伴们测试了一款全能超高清解码播放器——完美解码。 这是一款为众多影视发烧友精心打造的专业高清播放器。超强HDTV支持&#xff0c;画质远超主流播放器&#xff01;全面开启硬件加速&#xff0c;CPU资源占用低&#xff0c;强劲高清解码…

Matplotlib绘制漂亮的饼状图|python绘制漂亮的饼状图

python绘图系列文章目录 往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机…

LeetCode刷题 --- 栈

栈&#xff08;stack&#xff09;是一种用于存储数据的简单数据结构。栈一个有序线性表&#xff0c;只能在表的一端&#xff08;PS&#xff1a;栈顶&#xff09;执行插人和删除操作。最后插人的元素将被第一个删除。所以&#xff0c;栈也称为后进先出&#xff08;Last In First…

AI在狂飙,ChatGPT-4可直接在iPhone上使用啦

今天凌晨&#xff0c;OpenAI 正式在 App Store 推出了 ChatGPT 的 iOS app&#xff0c;瞬间冲上苹果商店免费榜第二名&#xff0c;效率榜第一名。 于是兴致勃勃的去下载体验了一番。整体不错&#xff0c;以后手机使用官方的 ChatGPT 更方便啦&#xff01;而且使用 GPT4 不再麻…

JavaScript事件流

一、事件流和它的两个阶段 1.事件流&#xff1a;是事件完整执行过程中的流动路径 2.说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 &#xff08;1&#xff09;捕获&#xff1a;从父到子 &#…

测试工程师都是怎么写测试用例的?​

很多人不知道写测试用例有什么用&#xff0c;而仅仅是像工具人一样&#xff0c;在每次提测之前&#xff0c;把测试用例照着需求文档抄一遍&#xff0c;仿佛像是走个过场。 开发提测之后&#xff0c;就照着测试用例点点点&#xff0c;可能一天就走完用例了&#xff0c;开发代码…

最优化理论-线性规划中的大M法的步骤

目录&#xff1a; 一、引言 二、线性规划的基本概念 三、最优化理论中的大M法 1. 大M法的基本思想 2. 大M法的步骤 3. 大M法的优缺点 四、大M法的应用 1. 生产计划问题 2. 运输问题 3. 投资问题 五、总结 一、引言 最优化理论是数学中的一个重要分支…

【2023/05/19】NFA

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第14天。 非确定有限状态自动机&#xff08;NFA&#xff09;是一种模拟复杂系统行为的数学模型 目录 一、基本概念和理论 二、优点和缺点 三、应用场景 四、问题和挑战 五、重要性、作用和使用价值 …

学习HCIP的day.07

目录 7、SPF算法 --- OSPF防环机制 OSPF区域间防环 OSPF域外防环 基于以上长篇理论总结&#xff1a; 7、SPF算法 --- OSPF防环机制 &#xff08;1&#xff09;在同一个区域每台路由具有一致的LSDB &#xff08;2&#xff09;每台路由器以自己为根计算到达每个目标的最短路…

Java泛型,数组和方法返回类型 - 协变,逆变和不变

首先&#xff0c;让我们通常理解一下子类型规则是什么。 协变vs逆变vs双变vs不变 编程语言可能有支持以下子类型规则的特性&#xff1a; 协变 允许用超类型替换子类型。 逆变 允许用子类型替换超类型。 双变 同时是协变和逆变。 不变 不允许上述任何替换。 让我们看看Java支持哪…

Intellij IDEA 如何删掉插件

在 Intellij IDEA 的配置中&#xff0c;找到插件选项。 在插件选项中&#xff0c;选择需要删除的插件&#xff0c;然后在右侧的对话框中选择 uninstall 就可以了。 卸载以后&#xff0c;可能不会要求重启&#xff0c;为了安全起见&#xff0c;还是重启下你的 IDE 吧。

C++容器详解

什么是容器 首先&#xff0c;我们必须理解一下什么是容器&#xff0c;在C 中容器被定义为&#xff1a;在数据存储上&#xff0c;有一种对象类型&#xff0c;它可以持有其它对象或指向其它对像的指针&#xff0c;这种对象类型就叫做容器。很简单&#xff0c;容器就是保存其它对…

Flutter控件之文本Text封装

Flutter控件之基类Widget封装 上篇文章&#xff0c;我们简单针对Widget做了一个基类封装&#xff0c;拓展出了很多常见又易用的属性&#xff0c;比如宽高&#xff0c;内外边距等等&#xff0c;很方便的为接下来的各个基础组件的封装&#xff0c;提供极大的便利&#xff0c;在上…

虚拟机启动时出现“已启用侧通道缓解”的解决方法

系列文章目录 Hypervisor launch failed centos7配置ssh免密登陆完成&#xff0c;进行ssh登陆时出现”代理承认未能使用密钥签名“ 解决pip更新的代码 文章目录 系列文章目录 一、问题描述 二、启用了侧通道缓解的虚拟机可能会出现性能下降 &#xff08;79832&#xff0…

Linux系统vim查看文件中文乱码

Linux系统查看文件-cat中文正常显示 vim中文乱码 1、背景2、环境3、目的4、原因5、操作步骤5.1、修改vim编码配置 6、验证 1、背景 服务器部署业务过程中查看文件内容&#xff0c;使用cat 命令查看中文正常显示&#xff0c;使用vim命令查看显示中文乱码 cat 查看 vim 查看 …

陶哲轩宣布主持白宫生成式AI工作组,李飞飞、Hassabis发表演讲

来源 | 新智源 ID | AI-era 【导读】最近&#xff0c;「数学天才」陶哲轩表示&#xff0c;自己将领导白宫生成式人工智能工作组&#xff0c;就当前AI评估并收集意见。在陶哲轩看来&#xff0c;加入工作流的ChatGPT在数学专业领域中&#xff0c;并没有太多增值。 近来&#xf…