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

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

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

#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;
}
相关文章
|
编解码 算法
【论文速递】Remote Sensing2021 : 通过半全局匹配法的SAR立体图像DSM生成以及惩罚方程的评估
【论文速递】Remote Sensing2021 : 通过半全局匹配法的SAR立体图像DSM生成以及惩罚方程的评估
|
Ubuntu Java Linux
Manjaro Linux 入门使用教程
Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验。
6856 1
Manjaro Linux 入门使用教程
|
Java Android开发 C++
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
786 0
【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )(二)
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
571 8
|
8月前
|
机器学习/深度学习 编解码 算法
对三种雷达信号调制类型的识别及MATLAB实现
对三种雷达信号调制类型的识别及MATLAB实现
|
开发者 UED
Axure“Web高端交互元件库”:产品与设计的得力助手
这套“Web高端交互元件库”精心构建了四大板块内容,分别是登陆首页集合、Web框架集合、表单元件集合以及主流后台组件。每一板块都包含了大量实用且美观的交互元件,设计师与开发者可以根据具体项目需求,快速找到并应用这些元件,从而大大提升工作效率。
318 1
|
机器学习/深度学习 人工智能 算法
「AI人工智能」什么是AI技术
**AI技术概览** 本文探讨人工智能(AI)的核心,包括知识图谱、问答系统和AI芯片。AI在硅光芯片、个性化推荐等领域展现趋势,前端开发与AI结合,涉及人机交互、数据可视化和模型训练。此外,文章讨论了监督学习的应用、深度学习工程师的市场需求,以及梯度消失等问题,提示了适宜的批量大小对随机梯度下降的影响。
4917 0
「AI人工智能」什么是AI技术
|
分布式计算 Hadoop Java
面向开发者的Hadoop编程指南
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。它由Hadoop分布式文件系统(HDFS)和MapReduce编程模型组成。本指南旨在帮助初学者和中级开发者快速掌握Hadoop的基本概念和编程技巧,并通过一些简单的示例来加深理解。
632 0
|
供应链 安全 专有云
阿里云通过信通院面向一云多芯的专有云技术能力评测
近日,阿里云飞天企业版通过中国信息通信研究院2023年度《面向一云多芯的专有云技术能力要求》,在异构兼容能力、专有云基础能力、迁移适配能力三个方面,再一次验证了阿里云专有云一云多芯领先的技术能力。
930 2