前言:重新看了一遍二叉樹,發現了很多問題,這兩天查了很多資料,比如說創建的時候為什么要傳入指針的指針(因為類似最早的swap(int a,int b) 你傳入a和b的值是無法改函數外面ab值要傳入指針,
那么這里創建也一樣在main中創建了一個BitNode * 型的指針p他為NULL,傳入函數中做完一系列操作函數結束后被收回,函數外的p仍然是NULL,所以得傳入指針的指針來修改p的值 )
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct BitNode
{
Elemtype data ;
struct BitNode * Lchild ;
struct BitNode * Rchild ;
}BitNode,*BiTree ;
void creatBiTree(BiTree * T) ;
void TraverseBitree(BiTree T) ;
void InOrderBitree(BiTree T);
void PostOrderBitree(BiTree T);
int leafCount(BiTree T,int * num);
int Treedeep(BiTree T);
void PrintTree(BiTree T,int h);
int main()
{
BiTree T =NULL;
int num=0, deep ;
printf("請輸入第一個結點的值,-1表示沒有葉結點:\n");
creatBiTree(&T);
printf("先序遍歷是:");
TraverseBitree(T);
printf("\n");
printf("中序遍歷是:");
InOrderBitree(T);
printf("\n");
printf("后序遍歷是:");
PostOrderBitree(T);
printf("\n");
printf("葉子結點有:");
leafCount(T,&num);
printf("\n");
printf("葉子結點個數是:%d\n",num);
deep =Treedeep(T);
printf("二叉樹的深度是:%d\n",deep);
deep=1;
PrintTree( T, deep) ;
}
//按先序遍歷創建二叉樹
void creatBiTree(BiTree * T)
{
Elemtype ch;
scanf("%d",&ch);
if(ch== -1 )
{
*T=NULL;
}
else
{
*T=(BiTree)malloc(sizeof(BitNode));
if(!(*T)) exit(-1);
(*T)->data=ch;
printf("輸入%d的左子節點:", ch) ;
creatBiTree(&(*T)->Lchild);
printf("輸入%d的右子節點:", ch);
creatBiTree(&(*T)->Rchild);
}
}
//先序遍歷
void TraverseBitree(BiTree T)
{
if(T!=NULL)
{
printf("%d ",T->data);
TraverseBitree(T->Lchild);
TraverseBitree(T->Rchild);
}
}
//中序遍歷
void InOrderBitree(BiTree T)
{
if(T!=NULL)
{
InOrderBitree(T->Lchild);
printf("%d ",T->data);
InOrderBitree(T->Rchild);
}
}
//后續遍歷
void PostOrderBitree(BiTree T)
{
if(T!=NULL)
{
PostOrderBitree(T->Lchild);
PostOrderBitree(T->Rchild);
printf("%d ",T->data);
}
}
//葉子結點的個數
int leafCount(BiTree T,int *num)
{
if(T!=NULL)
{
//if(T->Rchild->data == -1 && T->Lchild->data== -1) //這樣不行
if(T->Rchild ==NULL && T->Lchild== NULL)
{
(*num)++;
printf("%d ",T->data);//輸出葉子結點
}
leafCount(T->Lchild,num);
leafCount(T->Rchild,num);
}
// return num ;
}
//二叉樹的深度
int Treedeep(BiTree T)
{
int deep = 0;
if(T)
{
int leftdeep = Treedeep(T->Lchild);
int rightdeep =Treedeep(T->Rchild);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
//打印樹狀二叉樹
void PrintTree(BiTree T,int h)
{
int i;
if(T==NULL) return ;
PrintTree(T->Rchild,h+1);
for(i=0;i<h;i++)
{
printf(" ");
}
printf("%d\n",T->data);
PrintTree(T->Lchild,h+1);
}