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

7 篇文章 0 订阅
2 篇文章 0 订阅
今日系我大一下学期第二日……

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



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速度感到悲哀……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值