C语言实现二叉树创建,遍历,深度,叶子结点

前言:重新看了一遍二叉树,发现了很多问题,这两天查了很多资料,比如说创建的时候为什么要传入指针的指针(因为类似最早的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);
}

猜你喜欢

转载自www.cnblogs.com/cocobear9/p/12549673.html