`

种左一颗多功能二叉查找树(类),纯粹练习数据结构(代码+部分说明+白话文) .

阅读更多
今日系我大一下学期第二日……

之前睇左好多结构都未实践,今日无咩做,用五个钟左右种左一颗多功能二叉树,支持如下操作:



1.build(s,n){有随机开关,随便开{……^____^}}--------以一堆数为基础建树。



2.insert(key)--------插入结点。



3.del(key)--------删除指定关键字所在第一个结点。



4.cut(key)--------剪支(砍左以关键字key为根ge第一课子树)。



5.search(key)--------返回指定关键字第一个(因为有可能重复)指针。



6.max()--------返回整棵树ge最大关键字。



7.min()--------返回整棵树ge最小关键字。



8.pre(key)--------返回指定关键字ge前驱。



9.suc(key)--------返回指定关键字ge后继。



10.front_print()--------输出前序遍历。



11.middle_print()---------输出中序遍历。



12.behind_print()---------输出后序遍历。



13.left_son(key)--------返回关键字第一个结点ge左细路。



14.right_son(key)--------返回关键字第一个结点ge右细路。



15.l_rotate(key)--------左旋转第一个以key为关键字ge结点。



16.l_rotate(key)--------右旋转第一个以key为关键字ge结点。



17.get_root()---------返回根结点指针。



18.empty()--------检查树系唔系空左。



总共18个功能,各有用处挂我觉得,善用尼18个功能都几好ge~~5个钟其实大部分时间都系系度搵bug,有d感受到程序员个d痛苦。尼棵树剩系int容器,当然可以修改成为任意容器啦~~~{=___=}。



好咯……吾讲甘多废话拉,睇下代码咯。


//Muti-Function-Binary-Search-Tree

//Athtor SGetEternal{=___+}凸

 

class BST
{
 
private:
 
 struct node 
 {
  node *p,*left,*right;
  int key;
 };
 node *root,*x,*y,*w;

 void make_node(node *&temp)
 {
  temp=new node;
  temp->p=NULL;
  temp->left=NULL;
  temp->right=NULL;
  temp->key=0;
 }
 
public:
  
 node* search(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return NULL;
  }
  x=root;
  while (x->key!=key)
  {
   if (key>x->key) x=x->right;
   else x=x->left;
   if (x==NULL) break;
  }
  return x;
 }

 void insert(int key)
 {
  bool lr;
  if (root==NULL)
  {
   make_node(root);
   root->key=key;
   return ;
  }
  x=root;
  while (x!=NULL)
  {
   y=x;
   if (key>x->key) 
   {
    x=x->right;
    lr=1;
   }
   else 
   {
    x=x->left;
    lr=0;
   }
  }
  make_node(w);
  w->p=y;
  w->key=key;
  if (lr) y->right=w;
  else y->left=w;
 }
 
 void build(int *s,int n)
 {
  int i;
#if 0
  int a,b;
  for (i=0;i<n;i++)
  {
   srand((int)time(0));
   a=rand()%n;
   b=rand()%n;
   swap(s[a],s[b]);
  }
#endif
  for (i=0;i<n;i++)
   insert(s[i]);
 }
  
 void del(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  y=search(key);
  if (y==NULL)
  {
   printf("No such node!!/n");
   return ;
  }
  if (y==root && y->right==NULL)
  {
   root=y->left;
   delete y;
   return ;
  }
  if (y==root && y->left==NULL)
  {
   root=y->right;
   delete y;
   return ;
  }
  w=y;
  if (y->left!=NULL && y->right!=NULL)
   y=search(suc(key));
  x=y->left;
  if (x==NULL) x=y->right;
  if (x!=NULL) x->p=y->p;
  if (y!=root)
  {
   if (y==y->p->right) y->p->right=x;
   else y->p->left=x;
  }
  if (y!=w) w->key=y->key;
  delete y;
 }
  
 int max()
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  node *x=root;
  while (x->right!=NULL)
   x=x->right;
  return x->key;
 }
  
 int min()
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  node *x=root;
  while (x->left!=NULL)
   x=x->left;
  return x->key;
 }
  
 int suc(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  x=search(key);
  if (key==max())
  {
   printf("It's already the max number!!/n");
   return 0;
  }
  if (x==NULL) 
  {
   printf("No such number in the tree!!/n");
   return 0;
  }
  if (x->right!=NULL)
  {
   x=x->right;
   while (x->left!=NULL) x=x->left;
  }
  else 
  {
   y=x->p;
   while (y->left!=x)
   {
    x=y;
    y=y->p;
   }
   x=y;
  }
  return x->key;
 }
  
 int pre(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  x=search(key);
  if (key==min())
  {
   printf("It's already the min number!!/n");
   return 0;
  }
  if (x==NULL) 
  {
   printf("No such number in the tree!!/n");
   return 0;
  }
  if (x->left!=NULL)
  {
   x=x->left;
   while (x->right!=NULL) x=x->right;
  }
  else 
  {
   y=x->p;
   while (y->right!=x)
   {
    x=y;
    y=y->p;
   }
   x=y;
  }
  return x->key;
 }
  
 int left_son(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  if (search(key)==NULL) 
  {
   printf("No such node!!/n");
   return 0;
  }
  x=search(key)->left;
  if (x==NULL) 
  {
   printf("This node doesn't have left son!!/n");
   return 0;
  }
  else return x->key;
 }
 
 int right_son(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return 0;
  }
  if (search(key)==NULL) 
  {
   printf("No such node!!/n");
   return 0;
  }
  x=search(key)->right;
  if (x==NULL) 
  {
   printf("This node doesn't have right son!!/n");
   return 0;
  }
  else return x->key;
 }
  
 void l_rotate(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  x=search(key);
  if (x->right==NULL)
  {
   printf("It can't left-rotate!!/n");
   return ;
  }
  else 
  {
   w=x->right;
   w->p=x->p;
   if (x->p!=NULL) 
   {
    if (x==x->p->right) x->p->right=w;
    else x->p->left=w;
   }
   x->p=w;
   x->right=w->left;
   w->left=x;
   if (w->left!=NULL) w->left->p=x;
   if (x==root) root=w;
  }
 }
 
 void r_rotate(int key)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  x=search(key);
  if (x->left==NULL)
  {
   printf("It can't right-rotate!!/n");
   return ;
  }
  else 
  {
   w=x->left;
   w->p=x->p;
   if (x->p!=NULL) 
   {
    if (x==x->p->right) x->p->right=w;
    else x->p->left=w;
   }
   x->p=w;
   x->left=w->right;
   w->right=x;
   if (w->right!=NULL) w->right->p=x;
   if (x==root) root=w;
  }
 }
 
 void front_print(node *temp)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  if (temp!=NULL)
  {
   printf("%d ",temp->key);
   front_print(temp->left);
   front_print(temp->right);
  }
 }
  
 void middle_print(node *temp)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  if (temp!=NULL)
  {
   middle_print(temp->left);
   printf("%d ",temp->key);
   middle_print(temp->right);
  }
 }
  
 void behind_print(node *temp)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  if (temp!=NULL)
  {
   behind_print(temp->left);
   behind_print(temp->right);
   printf("%d ",temp->key);
  }
 }
  
 void cut(node *temp)
 {
  if (empty())
  {
   printf("The tree is empty!!/n");
   return ;
  }
  if (temp!=NULL)
  {
   cut(temp->left);
   cut(temp->right);
   if (temp->p!=NULL) 
   {
    if (temp->p->right==temp) temp->p->right=NULL;
    else temp->p->left=NULL;
   }
   if (temp==root) root=NULL;
   delete temp;
  }
 }
  
 inline node* get_root() {return root;}

 inline bool empty(){return root==NULL;}
  
 BST () {root=NULL;}
  
 ~BST (){}
  
};



可以复制落电脑度玩下d左旋右旋ge~~~有bug提醒我窝{OTZ}

最后为杭电OJ ge速度感到悲哀……
分享到:
评论

相关推荐

    PySpark 机器学习、自然语言处理与推荐系统配套代码+数据集.zip

    PySpark 机器学习、自然语言处理与推荐系统配套代码+数据集.zipPySpark 机器学习、自然语言处理与推荐系统配套代码+数据集.zipPySpark 机器学习、自然语言处理与推荐系统配套代码+数据集.zipPySpark 机器学习、自然...

    《茶经》白话文.pdf

    《茶经》白话文.pdf 《茶经》是中国乃至世界现存最早、最完整、最全面介绍茶的第一部专著,被誉为“茶叶百科全书”,由中国茶道的奠基人陆羽所著。茶经原文的内容非常丰富,包括茶叶生产的历史、源流、现状、生产...

    数学建模 数据结构.zip

    树结构,如二叉搜索树、平衡树(AVL、红黑树),适用于查找和排序任务。哈希表则提供快速的查找功能,但依赖于良好的哈希函数设计。 在数学建模比赛中,源码参考可以帮助参赛者理解如何将理论模型转化为实际代码。...

    白话文的发展史.doc

    实际上,文言文自古以来就与口语相脱离,它更多地是一种书面表达形式,而非实际口语的记录。 文言文的形成并非一蹴而就,它有着漫长而复杂的历史演变。据科学研究,汉语的历史至少有百万年之久,而汉字的诞生则远比...

    白话文运动的危机

    白话文运动的危机,CAJViewer 文件,使用CAJViewer软件查看

    More Windows白话经典数据结构算法之七大排序最新整理版

    ### 数据结构与排序算法详解 #### 一、冒泡排序 冒泡排序是最基础也是最容易理解的排序算法之一。它的基本思路是通过不断地比较相邻两个元素,并根据比较结果进行交换来实现排序。整个过程如同气泡逐渐上升一样,...

    腾讯比赛部分代码.zip

    这个压缩包可能包含了参赛者解决特定问题的算法、数据结构实现或者整个项目的部分代码。 【描述】:“腾讯比赛部分代码.zip”的描述简单明了,它表明这个压缩文件包含了与腾讯比赛相关的代码片段。参赛者可能会使用...

    《太上感应篇》原文以及白话文.docx

    "《太上感应篇》原文以及白话文.docx" 《太上感应篇》是中国古代的一篇道教经典,讲述了善恶有报、因果关系、天道佑护等道教基本教义。该文以太上老君的口吻,讲述了天道的法则、人生的道德准则、善恶的报应、以及...

    使用node.js+express+bootstrap+mongodb做简易的博客系统.zip

    MongoDB是一个文档型数据库,使用JSON格式的文档存储数据,非常适合处理结构灵活的数据。在博客系统中,MongoDB可以存储用户信息、文章内容、评论等数据。其灵活性使得我们能轻松地添加或修改数据结构,而无需进行...

    车载诊断UDS白话文.7z

    UDS服务涵盖了多个方面,包括识别ECU、读取和清除故障码、数据流读取、执行元件测试、编程与刷新等。这些服务使得维修人员可以对车辆进行精确的故障定位和修复,提高了工作效率。UDS服务通过一系列特定的请求和响应...

    白话机器学习的数学-立石贤吾-源代码.zip

    白话机器学习的数学-立石贤吾-源代码.zip

    基于Vue + Node.js + Express + MongoDB + ES6制作的购物商城系统 (高仿小米商城)

    基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,...

    java课程设计作业-基于java实现的扫雷游戏(源码+设计说明文档+可执行文件),直接点击“扫雷.exe”即可运行

    java课程设计作业——基于java实现的扫雷游戏(源码+设计说明文档+可执行文件),直接点击“扫雷.exe”即可运行 --利用swing做出的扫雷桌面游戏,运行时直接双击可执行文件夹下的“扫雷.exe”即可 java课程设计...

    2019年公司年会抽奖系统(Vue.js + Koa2 + MongoDB).zip

    在本项目中,Vue.js 负责构建用户界面,提供数据绑定、指令系统、组件化功能,使得UI与后台数据能够实时同步,为年会抽奖的交互体验提供支持。Vue.js 的组件化结构使得代码可重用性高,易于维护。 2. **Koa2**: ...

    基于Node.js + Express + MongoDB实现的电商后台管理系统.zip

    基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,...

    基于springboot+thymeleaf+mybatis+tale.js+redis简洁的个人博客系统源码,适合快速全栈学习

    基于springboot+thymeleaf+mybatis+tale.js+redis简洁的个人博客系统源码,适合快速全栈学习,项目经过严格测试,确保可以运行! 1.涉及技术及工具 核心框架:SpringBoot ORM 框架:MyBatis MyBatis 工具:MyBatis...

    Backend system based on node.js + Mongodb. 基于 node.js + Mongodb

    在构建基于Node.js和MongoDB的后端系统时,我们涉及了多个关键技术和概念,这些都是构建现代Web应用程序的基础。Node.js作为一个高效的JavaScript运行环境,以其异步非阻塞I/O和事件驱动的特性,为开发高性能服务器...

    《僧伽吒经》+白话全文注释版(第三卷下)[文].pdf

    《僧伽吒经》+白话全文注释版(第三卷下)[文].pdf

    白话c++.rar

    《白话C++》是一本面向C++初学者的通俗易懂的教程,它旨在以简单、生动的方式介绍C++编程语言的基础知识。C++是一种强大的、通用的、面向对象的编程语言,广泛应用于系统软件、应用软件、游戏开发、设备驱动等各个...

Global site tag (gtag.js) - Google Analytics