#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");
}
#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");
}
本文介绍了一种通过中序和后序序列构建二叉树的方法,并提供了前序遍历、计算二度节点数量、叶子节点数量及高度等功能。文章还讨论了如何判断二叉树是否为AVL树。
9707

被折叠的 条评论
为什么被折叠?



