C語言實現二叉樹的基本操作---建立、遍歷、求深度、求葉子結點
#include <stdlib.h>
#include <malloc.h>
typedefint ElemType;//資料型別
//定義二叉樹結構,與單鏈表相似,多了一個右孩子結點
typedef struct BiTNode{
ElemType data;//資料域
struct BiTNode*lChild, *rChlid;//左右子樹域
}BiTNode, *BiTree;
//先序建立二叉樹
int CreateBiTree(BiTree *T)
{
ElemType ch;
ElemType temp;
scanf("%d", &ch);
temp = getchar();
if (ch == -1)
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!(*T))
exit(-1);
(*T)->data = ch;
printf("輸入%d的左子節點:", ch);
CreateBiTree(&(*T)->lChild);
printf("輸入%d的右子節點:", ch);
CreateBiTree(&(*T)->rChlid);
}
return 1;
}
//先序遍歷二叉樹
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
printf("%d ", T->data);
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
//中序遍歷二叉樹
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
printf("%d ", T->data);
InOrderBiTree(T->rChlid);
}
//後序遍歷二叉樹
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
printf("%d ", T->data);
}
//二叉樹的深度
int TreeDeep(BiTree T)
{
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lChild);
int rightdeep = TreeDeep(T->rChlid);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
//求二叉樹葉子結點個數
int Leafcount(BiTree T,int &num)
{
if(T)
{
if(T->lChild ==NULL &&T->rChlid==NULL)
num++;
Leafcount(T->lChild,num);
Leafcount(T->rChlid,num);
}
return num;
}
//主函式
int main(void)
{
BiTree T;
BiTree *p = (BiTree*)malloc(sizeof(BiTree));
int deepth,num=0 ;
printf("請輸入第一個結點的值,-1表示沒有葉結點:\n");
CreateBiTree(&T);
printf("先序遍歷二叉樹:\n");
TraverseBiTree(T);
printf("\n");
printf("中序遍歷二叉樹:\n");
InOrderBiTree(T);
printf("\n");
printf("後序遍歷二叉樹:\n");
PostOrderBiTree(T);
printf("\n");
deepth=TreeDeep(T);
printf("樹的深度為:%d",deepth);
printf("\n");
Leafcount(T,num);
printf("樹的葉子結點個數為:%d",num);
printf("\n");
return 0;
}