#include<stdio.h>
typedef?struct?bitnode{
int?date;
struct?bitnode?*?lchild,?*rchild;
}bitnode,*bitree;
int?j=0;
//函數說明
bitree?*createbitree(bitree?*T);
int?Qtraversebitree(bitree?T);
int?Ztraversebitree(bitree?T);
int?Htraversebitree(bitree?T);
int?Ftraversebitree(bitree?T);
/*******************主函數****************************/
main()
{
bitree?Tree,*T?;?int?k;
do?{
printf("\n╔-----------------------------------------------╗");?//顯示壹個簡易菜單
printf("\n┆?先序創建----1?先序遍歷------2┆");
printf("\n┆?中序遍歷----3?後序遍歷------4┆");
printf("\n┆?葉子個數---?5?退出程序------6┆");
printf("\n╚-----------------------------------------------╝\n");?
printf("請輸入所要進行的操作序號:?");
scanf("%d",&k);//接受用戶的選擇
switch(k)//接受用戶的函數
{case?1:?printf("左右子樹為空時用0代替,用間隔符隔開:\n");
T=createbitree(&Tree);
break;
?case?2:Qtraversebitree(*T?);
break;
?case?3:Ztraversebitree(*T?);
break;
?case?4:Htraversebitree(*T?);
break;
?case?5:printf("\n葉子個數為:?%d\n",Ftraversebitree(*T?));
break;
?case?6:break;
default:printf("錯誤選擇!請重選\n");break;
}
}while(k!=6); //直到i被賦值為6
return?0;?
}
/*******************創建二叉樹函數****************************/
bitree?*createbitree(bitree?*T)
{
char?ch;
scanf("%d",&ch);
if(ch==0)?
(*T)=NULL;
else{?
if(!((*T)?=(bitnode?*)malloc(sizeof(bitnode))))
exit(0);
(*T)->date?=?ch;?//生成根節點?
createbitree(&(*T)->lchild);
createbitree(&(*T)->rchild);
}
return?T;}
/*******************先序遍歷函數****************************/
Qtraversebitree(bitree?T)
{?
if(T){printf("%d?",T->date);
?if(Qtraversebitree(T->lchild))
?if(Qtraversebitree(T->rchild))?return?1;
return?0;
}
else?return?1;
}
/*******************中序遍歷函數****************************/?
Ztraversebitree(bitree?T)
{?
if(T){if(Ztraversebitree(T->lchild))
?printf("%d?",T->date);
if(Ztraversebitree(T->rchild))?return?1;
return?0;
}
else?return?1;
}
/*******************後序遍歷函數****************************/
Htraversebitree(bitree?T)
{?
if(T){if(Htraversebitree(T->lchild))
if(Htraversebitree(T->rchild))?
printf("%d?",T->date);?return?1;
return?0;
}
else?return?1;
}
/******************返回葉子節點個數函數*************/
Ftraversebitree(bitree?T)
{?
if(T){if(!((T->lchild)||(T->rchild)))?j++;?
?if(Ftraversebitree(T->lchild))
?if(Ftraversebitree(T->rchild))?return?j;
return?j;
}
else?return?j;
}