求二叉树的高,节点个数,遍历二叉树

本文介绍了一种通过中序和后序序列构建二叉树的方法,并提供了前序遍历、计算二度节点数量、叶子节点数量及高度等功能。文章还讨论了如何判断二叉树是否为AVL树。
#include "stdio.h"
#include "malloc.h"
#include "math.h"
#include "string.h"
#define MAX 100
void exit(int);
/*--------------------*/



int count; /* 记录二叉树中的二度结点的个数 */
int flag; /* 标明二叉树是否为AVL树 */



/*--------------------*/



typedef struct node{
char d;
struct node *lchild,*rchild;
}TNode;

/*-----通过中序序列和后序序列建树-----*/



void MkTree(char in[],int is,int ie,char post[],int posts,int poste,TNode **r)
{
int i;
if(is>ie || posts>poste)
*r=NULL;
else{
*r=malloc(sizeof(TNode));
(*r)->d=post[poste];
for(i=is;i<=ie;i++)
if(post[poste]==in){
MkTree(in,is,i-1,post,posts,posts+i-is-1,&(*r)->lchild);
MkTree(in,i+1,ie,post,posts+i-is,poste-1,&(*r)->rchild);
break;
}
if(i>ie){
printf("error:input contains an error!/n");
exit(9);
}
}
}



/*-----前序遍历二叉树-----*/



void preorder(TNode *r)
{
if(r){
printf("%c",r->d);
preorder(r->lchild);
preorder(r->rchild);
}
}

/*-----求二叉树中二度结点的个数-----*/



void BNode(TNode *r)
{
if(r){
if(r->lchild&&r->rchild)
count++;
BNode(r->lchild);
BNode(r->rchild);
}
}



/*-----求二叉树中叶子的个数-----*/



int leaf(TNode *r)
{
if(r==NULL)
return 0;
else
if(r->lchild==NULL && r->rchild==NULL)
return 1;
else
return leaf(r->lchild) + leaf(r->rchild);
}



/*-----求二叉树中叶子的高度-----*/



int Height(TNode *r)
{
int h1,h2;
if(r==NULL)
return 0;
else{
h1=Height(r->lchild);
h2=Height(r->rchild);
if(abs(h1-h2)>1)
flag=1;
return 1+(h1>h2?h1:h2);
}
}

void main()
{
TNode *r;
int height;
char post[MAX],in[MAX];
printf("Input inorder and postorder :/n");
gets(in);
gets(post);
MkTree(in,0,strlen(in)-1,post,0,strlen(post)-1,&r);
printf("The preorder is as follows:/n");
preorder(r);
printf("/nThere are %dletters in the tree./n",leaf(r));
count=0;
BNode(r);
printf("/nThere are %d binarynode in the tree./n",count);
flag=0;
height=Height(r);
printf("/nThe height of the tree is %d/n",height);
if(flag==1)
printf("/nThis bintree is not an AVL!/n");
else
printf("/nThis bintree is an AVL!/n");
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值