分享一个可以实现建树,遍历树,求数的总结点,叶子节点,树的深度的递归代码。
测试样例:
输入:
ABC##DE#G##F###
运行结果:
PreOrder the tree is:ABCDEGF
InOrder the tree is:CBEGDFA
PostOrder the tree is:CGEFDBA
先序遍历序列(非递归):ABCDEGF
该二叉树中结点总数为:7
该二叉树中叶子结点总数为:3
该二叉树深度为:5
实现代码:
#include<stdio.h>
#include<malloc.h>
#define MAX 20
typedef struct BTNode{ /*节点结构声明*/
char data; /*节点数据*/
struct BTNode *lchild;
struct BTNode *rchild ; /*指针*/
}*BiTree;
void createBiTree(BiTree *t){ /* 先序遍历创建二叉树*/
char s;
BiTree q;
s=getchar();
if(s=='#'){
*t=NULL;
return;
}
q=(BiTree)malloc(sizeof(struct BTNode));
if(q==NULL)
printf("Memory alloc failure!");
q->data=s;
*t=q;
createBiTree(&q->lchild); /*递归建立左子树*/
createBiTree(&q->rchild); /*递归建立右子树*/
}
void PreOrder(BiTree p){ /* 先序遍历二叉树*/
if (p!= NULL){
printf("%c",p->data);
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
void InOrder(BiTree p){ /* 中序遍历二叉树*/
if(p!=NULL){
InOrder(p->lchild);
printf("%c",p->data);
InOrder(p->rchild);
}
}
void PostOrder(BiTree p){ /* 后序遍历二叉树*/
if ( p!= NULL ) {
PostOrder(p->lchild);
PostOrder(p->rchild);
printf("%c",p->data);
}
}
void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/
BiTree stack[MAX],q;
int top=0,i;
for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/
q=p;
while(q!=NULL){
printf("%c",q->data);
if(q->rchild!=NULL) stack[top++]=q->rchild;
if(q->lchild!=NULL) q=q->lchild;
else
if(top>0) q=stack[--top];
else q=NULL;
}
}
int Count(BiTree T) /* 求二叉树中结点总数*/
{
if(T==NULL)
return 0; /*空二叉树结点数为0*/
else /*左右子树结点总数加1*/
return Count(T->lchild)+Count(T->rchild)+1;
}
int Counts(BiTree top){ /* 求二叉树中叶子结点总数*/
if(top == NULL){
return 0;
}
else if((top->lchild==NULL) && (top->rchild==NULL)){
return 1;
}
else{
return Counts(top->lchild)+Counts(top->rchild);
}
}
int treeDepth(BiTree T){ /* 求二叉树深度*/
if(T==NULL){
return 0;
}
int Left=treeDepth(T->lchild);
int Right=treeDepth(T->rchild);
return Left > Right ? Left+1 : Right+1;
}
void release(BiTree t){ /*释放二叉树空间*/
if(t!=NULL){
release(t->lchild);
release(t->rchild);
free(t);
}
}
int main(){
BiTree t=NULL;
printf("\nplease input data:(exit for #)");
createBiTree(&t);
printf("\n\nPreOrder the tree is:");
PreOrder(t);
printf("\n\nInOrder the tree is:");
InOrder(t);
printf("\n\nPostOrder the tree is:");
PostOrder(t);
printf("\n\n先序遍历序列(非递归):");
Preorder_n(t);
printf("\n\n该二叉树中结点总数为:%d",Count(t));
printf("\n\n该二叉树中叶子结点总数为:%d",Counts(t));
printf("\n\n该二叉树深度为:%d",treeDepth(t));
release(t);
return 0;
}