您好,登錄后才能下訂單哦!
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct node{
char data; /*此例中二叉樹的結點采用字符類型*/
struct node *lchild,*rchild;
}NODE;
/*按先序遍歷序列創建二叉樹的二叉鏈表*/
NODE *crt_bt_pre(){
NODE *bt;
char ch;
flushall();
scanf("%c",&ch);
if(ch == '0')
bt = NULL;
else{
bt = new NODE;
bt -> data = ch;
printf("\n\t請輸入%c結點的左孩子:",bt -> data);
bt -> lchild = crt_bt_pre();
printf("\n\t請輸入%c結點的右孩子:",bt -> data);
bt -> rchild = crt_bt_pre();
}
return bt;
}
/*先序遍歷二叉樹*/
void Preorder(NODE *bt){
if (bt != NULL){
printf("%c",bt -> data);
Preorder(bt -> lchild);
Preorder(bt -> rchild);
}
}
/*中序遍歷二叉樹*/
void Inorder(NODE *bt){
if (bt != NULL){
Inorder(bt -> lchild);
printf("%c",bt -> data);
Inorder(bt -> rchild);
}
}
//后序遍歷二叉樹
void Postorder(NODE *bt){
if (bt != NULL){
Postorder(bt -> lchild);
Postorder(bt -> rchild);
printf("%c",bt -> data);
}
}
/*統計二叉樹中葉子結點的個數*/
int CountLeaf(NODE *bt){
static int count;
if(bt == NULL)
return 0;
else{
if(bt -> lchild == NULL && bt -> rchild == NULL)
count++;
else{
CountLeaf(bt -> lchild);
CountLeaf(bt -> rchild);
}
return(count);
}
}
/*統計二叉樹中根結點的總數*/
int CountNode(NODE *bt){
static int count;
if(bt == NULL)
return 0;
else{
count++;
CountNode(bt -> lchild);
CountNode(bt -> rchild);
return(count);
}
}
/*求二叉樹的深度*/
int TreeDepth(NODE *bt){
int ldep,rdep;
if(bt == NULL)
return 0;
else{
ldep = TreeDepth(bt -> lchild);
rdep = TreeDepth(bt -> rchild);
if(ldep > rdep)
return(ldep+1);
else
return(rdep+1); //有錯誤
}
}
//求二叉樹的寬度
int TreeWidth(NODE *b)
{
struct
{
int lno;
NODE*p; //節點指針
}Qu[MaxSize]; //定義順序非循環隊列
int front,rear;
int lnum,max,i,n;
front=rear=0; //置隊列為空隊
if (b!=NULL)
{
rear++;
Qu[rear].p=b; //根節點指針入隊
Qu[rear].lno=1; //根節點的層次編號為1
while (rear!=front) //次循環通過層次遍歷求每個節點的層次
{
front++;
b=Qu[front].p; //對頭出對
lnum=Qu[front].lno;
if (b->lchild!=NULL) //左孩子入隊
{
rear++;
Qu[rear].p=b->lchild;
Qu[rear].lno=lnum+1;
}
if (b->rchild!=NULL) //右孩子入隊
{
rear++;
Qu[rear].p=b->rchild;
Qu[rear].lno=lnum+1;
}
}
max=0;lnum=1;i=1; //lnum從第一層開始
while (i<=rear) //通過比較相同層次的結點數求樹的寬度
{
n=0;
while (i<=rear&&Qu[i].lno==lnum)
{
n++;
i++;
}
lnum=Qu[i].lno;
if (n>max)
{
max=n;
}
}
return max;
}
else
return 0;
}
//int system(const char *string); //自動清屏代碼
//char Check()
//{
// printf("是否清屏:Y|N");
// char a;
// scanf("%c",&a);
// if (a=='y'||a=='Y')
// {
// return a;
// }
// else
// return 'N';
//}
//void clear()
//{
// printf("是否清屏(Y|N):");
// char a;
// scanf("%c",&a);
// if (a=='y'||a=='Y')
// {
// system("pause");
// system("cls");
// }
//}
//菜單函數
void shoumenu(){
printf("\n\n\n");
printf(" --二叉樹的基本運算--\n");
printf("*****************************************\n");
printf("* 1------建二叉樹 *\n");
printf("* 2------先序遍歷 *\n");
printf("* 3------中序遍歷 *\n");
printf("* 4------后序遍歷 *\n");
printf("* 5------統計葉子數 *\n");
printf("* 6------統計結點數 *\n");
printf("* 7------求二叉樹深度 *\n");
printf("* 8------求二叉樹寬度 *\n");
printf("* *\n");
printf("* 0------退出 *\n");
printf("*****************************************\n");
printf("請選擇菜單號(0--8):");
}
//選擇功能函數
void binaryOP(){
NODE *bt = NULL;
int count = 0;
char choice = 'N';
int x;
while(choice != '0'){
shoumenu();
flushall();
scanf("%c",&choice);
switch(choice){
case '1':
printf("\n\t請輸入按先序建立二叉樹的結點序列:");
printf("\n\t 說明:逐個輸入,'0'代表后繼結點為空,按回車輸入下一個結點");
printf("\n\t請輸入根結點:");
bt = crt_bt_pre();/*調用創建二叉樹的函數*/
printf("\n\t二叉樹成功建立!\n");
//clear();
break;
case '2':
if (bt == NULL){
printf("\n\t空樹");
}
else{
printf("\n\t該二叉樹的先序遍歷的序列為:");
Preorder(bt);/*調用先序遍歷函數*/
}
printf("\n");
//clear();
break;
case '3':
if (bt == NULL){
printf("\n\t空樹");
}
else{
printf("\n\t該二叉樹的中序遍歷序列:");
Inorder(bt);/*調用中序遍歷函數*/
}
printf("\n");
//clear();
break;
case '4':
if (bt == NULL){
printf("\n\t空樹");
}
else{
printf("\n\t該二叉樹的后序遍歷序列為:");
Postorder(bt);/*調用后序遍歷函數*/
}
printf("\n");
//clear();
break;
case '5':
count = CountLeaf(bt);/*調用統計葉子結點個數的函數*/
printf("\n\t該二叉樹有%d個葉子結點。\n",count);
printf("\n");
//clear();
break;
case '6':
count = CountNode(bt);/*調用統計結點總數的函數*/
printf("\n\t該二叉樹共有%d個結點 \n",count);
printf("\n");
//clear();
break;
case '7':
x = TreeDepth(bt);/*調用求二叉樹深度的函數*/
printf("\n\t 該二叉樹的深度為%d",x);
printf("\n");
//clear();
break;
case'8':
int n;
n=TreeWidth(bt);
printf("\n\t 該二叉樹的寬度為%d\n",n);
//clear();
break;
case '0':
printf("\n\t 程序結束!\n");
printf("\n");
//clear();
break;
default :
printf("\n\t輸入有誤,請重新輸入!\n");
printf("\n");
//clear();
}
}
}
void main()
{
binaryOP();
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。