二叉树
下面写的是有关二叉树的一些算法(二叉树的建立、遍历、深度的计算、输出叶结点、删除想要删除的叶结点):
-
#include<malloc.h>
-
#include<stdio.h>
-
#define max 20
-
-
typedef struct BiTree
-
{
-
struct BiTree *l;
-
double value;
-
}*node,Node;
-
-
typedef struct stud
-
{
-
int a[max];
-
}stud;
-
-
node insert(double key,node root)
-
{
-
node p,f;
-
p=root;
-
while(p!=NULL)
-
{
-
if(key<p->value)
-
{
-
f=p;
-
p=p->l;
-
}
-
else
-
if(key>p->value)
-
{
-
f=p;
-
p=p->r;
-
}
-
else
-
{
-
break;
-
}
-
}
-
if(p==NULL)
-
return (f);
-
else
-
return NULL;
-
}
-
-
node creadBiTree()
-
{
-
int n;
-
node root,f,p;
-
double m,data;
-
scanf("%lf",&data);
-
root=malloc(sizeof(Node));
-
if(data==0)
-
root=NULL;
-
else
-
{
-
root->value=data;
-
root->l=root->r=NULL;
-
scanf("%lf",&data);
-
while(data!=0)
-
{
-
f=insert(data,root);
-
p=malloc(sizeof(Node));
-
p->value=data;
-
p->l=p->r=NULL;
-
if(f!=NULL)
-
{
-
if(data<f->value)
-
{
-
f->l=p;
-
f=p->parents;
-
}
-
else
-
{
-
f->r=p;
-
f=p->parents;
-
}
-
}
-
scanf("%lf",&data);
-
}
-
}
-
return (root);
-
}
-
-
int depth(node root)
-
{
-
int ld,rd;
-
if(root==NULL)
-
return 0;
-
else
-
{
-
ld=depth(root->l);
-
rd=depth(root->r);
-
}
-
if(ld>rd)
-
return ld+1;
-
else
-
return rd+1;
-
}
-
-
node search(node root,double k)
-
{
-
node p;
-
p=root;
-
while(p!=NULL)
-
if(p->value==k)
-
return(p);
-
else
-
if(k<p->value)
-
p=p->l;
-
else
-
p=p->r;
-
return (NULL);
-
}
-
-
int PreOrderTraverse(node T)
-
{
-
if(T!=NULL)
-
{
-
PreOrderTraverse(T->l);
-
PreOrderTraverse(T->r);
-
}
-
else
-
return 1;
-
}
-
-
int leaf(node T)
-
{
-
if(T)
-
{
-
if((T->l==NULL)&&(T->r==NULL))
-
return 1;
-
else
-
return leaf(T->l)+leaf(T->r);
-
}
-
else
-
return 0;
-
}
-
-
//用了好大工夫才编出的一段程序:
-
void PostOrder(node T,int *i,stud *s)
-
{
-
if(T!=NULL)
-
{
-
if((T->l==NULL)&&(T->r==NULL))
-
{
-
s->a[*i]=T->value;
-
(*i)++;
-
return ;
-
}
-
PostOrder(T->l,i,s);
-
PostOrder(T->r,i,s);
-
}
-
else
-
return ;
-
}
-
//程序结束
-
-
void PreOrder(node T,double h)
-
{
-
if(T!=NULL)
-
{
-
if (T->value!=h)
-
{
-
PreOrder(T->l,h);
-
PreOrder(T->r,h);
-
}
-
else
-
{
-
free(T);
-
T=NULL;
-
}
-
}
-
else
-
return;
-
}
-
-
main()
-
{
-
int m,n,k,t,i=0,j=0;
-
node root,T;
-
double a;
-
stud s;
-
root=creadBiTree();
-
PreOrderTraverse(root);
-
m=depth(root);
-
n=leaf(root);
-
while(t!=0)
-
{
-
scanf("%lf",&a);
-
T=search(root,a);
-
if(T!=NULL)
-
else
-
scanf("%d",&t);
-
}
-
PostOrder(root,&i,&s);
-
for (j=0;j<i;j++)
-
scanf("%d",&k);
-
while(k>=1&&k<=n)
-
{
-
PreOrder(root,s.a[k-1]);
-
scanf("%d",&k)
- }
printf("该二叉树不存在这个叶结点