當前位置:成語大全網 - 新華字典 - 按先序遍歷輸出葉子結點的程序(可以用C++運行的C語言程序)

按先序遍歷輸出葉子結點的程序(可以用C++運行的C語言程序)

#include<stdlib.h>

#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;

}