简单二叉树的创建,删除,查找

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

{

相关文档
最新文档