二叉排序树的建立、查找、插入、删除

简介: 二叉排序树的建立、查找、插入、删除

如题,详情见下代码,基本类似于二叉树。

#include<iostream> 
using namespace std;
struct node{
  int data;
  node *lchild,*rchild;
};
void search(node* root,int x) { // 查找 
  if(root==NULL){  //没有查到 
    printf("fail!\n");
    return;
  }
  if(root->data==x){ //查到 
    printf("succeed!");
    return;
  }
  if(root->data>x)search(root->lchild,x);
  else search(root->rchild,x);
}
void insert(node* &root,int x){ //插入 
//要改变指针地址,所以引用 
  if(root==NULL){
    root=new node;
    root->data=x;
    root->lchild=root->rchild=NULL; 
    return;
  }
  if(root->data>x)insert(root->lchild,x);
  else insert(root->rchild,x);
}
node* creating(int a[],int n){  //创建二叉树 
  node* root=NULL;
  for(int i=0;i<n;i++)
  insert(root,a[i]);
  return root;  
}
void del(node* &root,int x){   //删除值为x的结点 
  if(root==NULL)return;    //查找不到 
  if(root->data==x){//查找到了,如果前面的search改为node*型这里就简单 
    node *pre,*p;
    pre=root;
    if(root->lchild==NULL&&root->rchild==NULL){
    //如果这个结点是叶子结点 ,直接删 
    root=NULL;return;}
    if(root->lchild!=NULL){ //如果结点有左子树,找前驱 
      p=root->lchild;
      while(p->rchild){
        pre=p;
        p=p->rchild;  
      }
      p->rchild=root->rchild;  
      //前驱p代替root位置,其左子树放在父亲 pre的右子树上 
      pre->rchild=p->lchild;
      p->lchild=root->lchild;
      delete(root);return;  
    }
    else{                   //结点只有右子树,找后继 
      p=root->rchild;
      while(p->lchild){
        pre=p;
        p=p->lchild;  
      }
      p->rchild=root->rchild;
      //后继p代替root位置,其右子树放在父亲 pre的左子树上 
      pre->lchild=p->rchild;
      p->lchild=root->lchild;
      delete(root);return;  
    }
  }
    if(root->data>x) 
  del(root->lchild,x);
  else del(root->rchild,x);
  }
void preorder(node* root){  //先序遍历,用来检测下结果 
  if(root==NULL)return;
  printf("%d",root->data);
  preorder(root->lchild);
  preorder(root->rchild);
}
int main() {
  int a[]={4,1,2,8,7,9};
  node* root=creating(a,6);
  insert(root,3);
  del(root,9);
  preorder(root);
  return 0;
}
相关文章
|
Ubuntu Java Linux
Manjaro Linux 入门使用教程
Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验。
6698 1
Manjaro Linux 入门使用教程
|
Java Android开发 C++
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
718 0
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
|
4月前
|
Web App开发 Ubuntu 安全
Ubuntu操作系统全解析:桌面、服务器与风格详解
Linux Mint同样源自Ubuntu操作系统,并针对现代用户需求,预装了众多照片和多媒体应用程序。该系统秉承开源社区的理念,为用户提供安全、稳定且易于使用的操作系统。想要深入了解Linux Mint,不妨访问其官方网站。
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
432 8
|
11月前
|
存储 Shell 网络安全
Centos7.9安装openldap
Centos7.9安装openldap
397 16
|
开发者 UED
Axure“Web高端交互元件库”:产品与设计的得力助手
这套“Web高端交互元件库”精心构建了四大板块内容,分别是登陆首页集合、Web框架集合、表单元件集合以及主流后台组件。每一板块都包含了大量实用且美观的交互元件,设计师与开发者可以根据具体项目需求,快速找到并应用这些元件,从而大大提升工作效率。
262 1
|
机器学习/深度学习 人工智能 算法
「AI人工智能」什么是AI技术
**AI技术概览** 本文探讨人工智能(AI)的核心,包括知识图谱、问答系统和AI芯片。AI在硅光芯片、个性化推荐等领域展现趋势,前端开发与AI结合,涉及人机交互、数据可视化和模型训练。此外,文章讨论了监督学习的应用、深度学习工程师的市场需求,以及梯度消失等问题,提示了适宜的批量大小对随机梯度下降的影响。
4096 0
「AI人工智能」什么是AI技术
|
分布式计算 Hadoop Java
面向开发者的Hadoop编程指南
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。它由Hadoop分布式文件系统(HDFS)和MapReduce编程模型组成。本指南旨在帮助初学者和中级开发者快速掌握Hadoop的基本概念和编程技巧,并通过一些简单的示例来加深理解。
544 0
|
机器学习/深度学习 人工智能 监控
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾 目录 个人简介 一、什么内容是受欢迎的写作内容? 1.1、学生(计算机相关)群体 1.2、同行(开发者)群体 1.3、好内容的特点 二、一些经典的技术文章逻辑框架设计 2.1、从写作逻辑和结构角度考虑 (1)、对于bug类型的文章——通过分析刨根问底 (2)、对于学习类型的文章—通过案例学以致用 (3)、对于总结类型的文章—通过思考产生共鸣 2.2、从写作技巧考虑 (1)、题目和摘要必须简单、清晰明了且定位
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
|
机器学习/深度学习 算法 数据安全/隐私保护
数字水印的攻击类型
数字水印的攻击类型
720 0