简单二叉树的创建,删除,查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
姓名:
班级:
学号:
一、算法简介
简单二叉树的创建,删除,查找
二、基本原理
定义节点的结构体,内部成员包括数据data,父节点指针*parent,左子节点指针*lchild,右子结点指针*rchild,以及指针next,然后通过add()和move()函数建立一个二叉树;最后通过del()删除整个二叉树。
三、实现步骤
第一,创建二叉树结点
第二,创建构造二叉树的函数add()和move().在add()中调用move();然后在主函数中初始化二叉树为7个结点(通过建立二叉树的函数)。
创建的二叉树如图:
1 2
3 4 5 6
第三,最后一个个通过查找的方式进行删除结点。该方式不局限于顺序删除,可以
从任何一个结点开始删除,删除后会通过move重新构建,直到删除为止。
四、实验结果如下图
五、结论
本套算法在创建二叉树同时增加了有序检查,通过创建和删除一棵完全二叉树,还可以实现查找结点的功能,未实现遍历、插入、修改、替换等算法,程序较为简单,但是代码工整严谨,时间复杂度和空间复杂度可忽略不计。
六、源程序
#include
struct node
{ int data;
struct node *parent;
struct node *lchild;
struct node *rchild;
struct node *next;
}*head=NULL;
int num=0,b[10];
void move(struct node *p,struct node *s)
{
while(0)
{
if(s->data > p->data )
{
if(p->rchild==NULL)
{
p->rchild=s;
break;
}
else
{
p=p->rchild;
}
}
else
{
if(p->lchild==NULL)
{
p->lchild=s;
break;
}
}
}
}
void add(int x)
{
struct node *s=malloc(sizeof(struct node)),*p=malloc(sizeof(struct node));
s->data=x;
s->lchild=NULL;
s->rchild=NULL;
s->parent=NULL;
if(head==NULL)
{
head=s;
}
else
{
p=head;
move(p,s);
}
int a=1,v=1,k=6,f=1;
struct node *print(struct node *head,int x,int y)//打印或查找功能,x=1,打印
{
struct node *p=malloc(sizeof(struct node));
p=head;
if(p!=NULL)
{
print(p->lchild,x,y);
b[++num]=p->data;
if(x==1)
{
if(v==0)
{
printf("creat node %d: %d \n",a,p->data);
a=a+1;
}
}
print(p->rchild,x,y);
}
}
void del(int x)
{
struct node *m=malloc(sizeof(struct node));
if(head->data==x)//删除头结点
{
if(head->lchild==NULL && head->rchild==NULL)//头结点无左右子树
{
head=NULL;
}
else if(head->rchild==NULL)//头结点无右子树
{
head=head->lchild;
head->parent=NULL;
}
else //头结点左右子树均有(这里让左子树继位)
{
move(head->lchild,head->rchild);
head=head->lchild;
}
}
else
{
if(m->lchild==NULLL)
{
if(m->data > m->parent->data) //右子树
{
m->parent->rchild=NULL;
}
else
{
m->parent->lchild=NULL;
}
}
else if(m->lchild==NULL)
{
if(m->data > m->parent->data) //右子树
{
m->parent->rchild=m->rchild;
}
else
{
m->parent->lchild=m->rchild;
}
}
else if(m->rchild!=NULL)
{
m-> rchild=m->lchild;
}
else//这里让左子树继位
{
m->lchild-> parent;
}
}
free(m);
}
void main()
{