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

这篇具有很好参考价值的文章主要介绍了考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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;
}

 文章来源地址https://www.toymoban.com/news/detail-451418.html

到了这里,关于考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉排序树的插入删除和查找(数据结构实训)(难度系数100)

    二叉排序树的插入删除和查找 pre: 前序遍历 in: 中序遍历 post:后序遍历 insert: 插入,本题中不会出现相同的元素 delete: 删除,删除成功输出TRUE,没有该元素则输出FALSE,删除的方法是如果有左子树,以左子树中最大值作为新的树根,否则,以右子树最小值作为树根。 search:

    2024年01月25日
    浏览(37)
  • C语言数据结构二叉排序树的建立、插入、删除、查找操作(原理+完整代码)

    1、若左子树不为空,左子树上所有节点值小于 它根节点的值 2、若右子树不为空,右子树上所有节点值大于 它根节点的值 3、每个节点的左右子树也是二叉排序树 目的:提高查找、插入、删除的速度(不是为了排序) 时间复杂度:由于查找性能取决于树的形态,所以

    2024年02月09日
    浏览(38)
  • HCIP第十三天(笔记)

    STP --- 生成树协议 冗余 线路冗余 设备冗余 网关冗余 UPS冗余 二层环路引发的问题 1.广播风暴 --- 广播帧在二层环路中会形成顺时针和逆时针两重环路,无限循环,最终将导致设备宕机,最终导致网络瘫痪 2.MAC地址表的翻摆(MAC地址表的漂移)---- 因为循环的存在,导致MAC地址

    2024年02月16日
    浏览(30)
  • 【力扣刷题 | 第十三天】

    今天随机进行练习,题型上不会有什么限制,主要还是练习STL算法。 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并

    2024年02月10日
    浏览(37)
  • JAVA SE -- 第十三天

    (全部来自“韩顺平教育”) 一、集合框架体系 集合主要是两组(单列集合、双列集合) Collection接口有两个重要的子接口List 、Set,它们的实现子类都是单列集合 Map接口的实现子类是双列集合,存放的K-V  二、Collection接口 1、Collection接口实现类的特点  ①collection实现子类

    2024年02月14日
    浏览(31)
  • 学习Android的第十三天

    目录 Android TextClock 文本时钟控件 TextClock 控件主要属性和方法 简单的 TextClock 参考文档 Android AnalogClock 控件 AnalogClock 属性 Android Chronometer 计时器 Chronometer 属性 Chronometer 主要方法 范例: 完整的计时器 范例: 倒计时 Android TextClock 是一个用于在 Android 应用中显示当前日期和时

    2024年02月19日
    浏览(35)
  • 【数据结构】【算法】二叉树、二叉排序树、树的相关操作

    树结构是以分支关系定义的一种层次结构,应用树结构组织起来的数据,逻辑上都具有明显的层次关系。 操作系统中的文件管理系统、网络系统中的域名管理、数据库系统中的索引管理等都使用了树结构来组织和管理数据。 树 Tree 是由n个节点组成的有限集合。在任意一颗非

    2024年02月04日
    浏览(40)
  • 【算法第十七天8.1】530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

    链接 力扣530-二叉搜索树的最小绝对差 思路 链接 力扣501-二叉搜索树中的众数 思路 链接 力扣236.二叉树的最近公共祖先 思路

    2024年02月14日
    浏览(37)
  • 【Matlab数理统计知识点合集】新手入门第十三天

    掌握随机数的产生 了解概率密度函数等函数的使用 掌握统计图表的绘制方法 随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模

    2023年04月11日
    浏览(31)
  • 算法刷题Day 22 二叉搜索树的最近公共祖先+二叉搜索树中的插入操作+删除二叉搜索树中的节点

    根据二叉搜索树的性质,相比普通二叉树可以极大程度的简化代码,作为公共祖先其值一定在两个给定节点值之间,从树根往下遍历,第一次出现两个给定节点值之间的值,那个节点即为最近公共祖先(为什么是最近不是最远?根节点一般为最远,第一次出现的值处于两个给

    2024年02月17日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包