#include <stdio.h>
#include <malloc.h>
//定义二叉树
typedef struct bitnode
{
int data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
//创建二叉树利用先序创建
void createbitree(bitree *T)
{
int dat;
printf("请输入节点数据:");
scanf("%d",&dat);
if(dat==0) (*T) = NULL;
else
{
(*T) = (bitree)malloc(sizeof(bitnode));
(*T)->data=dat;
createbitree(&((*T)->lchild));
createbitree(&((*T)->rchild));
}
}
//二叉树的先序遍历递归算法
void postorder10(bitree T)
{
if (T != NULL)
{
printf("%d/t",T->data);
postorder10(T->lchild);
postorder10(T->rchild);
}
}
//二叉树的中序遍历递归算法
void postorder20(bitree T)
{
if (T != NULL)
{
postorder20(T->lchild);
printf("%d/t",T->data);
postorder20(T->rchild);
}
}
//二叉树的中序遍历非递归算法
void postorder21(bitree t)
{
bitree s[100];
int top=0;
while (t!=NULL || top!=0)
{
while (t!=NULL)
{
s[++top]=t; t=t->lchild ;
}
if (top!=0)
{
t=s[top--]; printf("%d/t",t->data); t=t->rchild;
}
}
}
//二叉树的后序遍历递归算法
void postorder30(bitree T)
{
if (T != NULL)
{
postorder30(T->lchild);
postorder30(T->rchild);
printf("%d/t",T->data);
}
}
//在二叉树t中查找值为x的结点
void locate(bitree t, int x)
{
bitree p;
p=t;
if (t == NULL)
printf("0/n");
else if( t->data == x)
printf("%d/n",p->data);
else
{
p=t->lchild;
if (p)
locate(t->lchild, x);
else
locate(t->rchild, x);
}
}
//以二叉链表作存储结构,试编写求二叉树深度的算法
int BinTreeDetth(bitree T)
{
int l,r;
if(T==NULL)return 0;
else
{
l=BinTreeDetth(T->lchild);
r=BinTreeDetth(T->rchild);
return((l>r?l:r)+1);
}
}
//以二叉链表作为存储结构,试编写求二叉树中叶子数的算法
int LeafCount1(bitree T)
{
int i,j;
if(!T) return 0; //空树没有叶子
else if(T->lchild==NULL&&T->rchild==NULL)
{
return 1; //叶子结点
}
else
{
i=LeafCount1(T->lchild);
j=LeafCount1(T->rchild);
return (i+j);
}
//左子树叶子数加上右子树叶子数
}
void main()
{
bitree T;int n,m;
createbitree(&T);
printf("Create Success!/n/n");
while(1)
{
printf("请输入你要执行的操作:/n");
printf("0------------------------结束此次操作/n");
printf("1----------------------------先序遍历/n");
printf("2----------------------------中序遍历/n");
printf("3----------------------------后序遍历/n");
printf("4----------------------查找你要的结点/n");
printf("5---------------求此二叉排序树的深度/n");
printf("6---------求此二叉排序树的叶子结点数/n");
scanf("%d",&n);
switch(n)
{
case 0:
return;
case 1:
printf("先序遍历为:/n");
postorder10(T);
printf("/n");
break;
case 2:
printf("中序遍历为:/n");
printf("递归:/n");
postorder20(T);
printf("/n");
printf("非递归:/n");
postorder21(T);
printf("/n");
break;
case 3:
printf("后序遍历为:/n");
postorder30(T);
printf("/n");
break;
case 4:
printf("请输入你要查找的结点:/n");
scanf("%d",&m);
printf("你要查找的结点为: /n");
locate(T,m);
break;
case 5:
printf("树的深度为:/n");
printf("%d/n",BinTreeDetth(T));
break;
case 6:
printf("此树的叶子结点数为:/n");
printf("%d/n",LeafCount1(T));
break;
}
}
}