首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-04 
种左一颗多功能二叉查找树(类),纯粹练习数据结构(代码+部分说明+白话文) .今日系我大一下学期第二日……之前

种左一颗多功能二叉查找树(类),纯粹练习数据结构(代码+部分说明+白话文) .
今日系我大一下学期第二日……

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



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速度感到悲哀……

热点排行