数据结构——二叉树遍历、深度、叶子节点数计算

来源:互联网 发布:单片机概念 术语 编辑:程序博客网 时间:2024/05/16 09:31

效果如下:

其中“#”代表空节点




/*数据结构——二叉树*/

#define StACK_INIt_SIZE 100 //存储空间初始分配量

#define StACKNCREMENt 50 //存储空间分配增量
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
typedef char telemtype;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild,*rchild;
}binode,*bitree;


int createbitree(bitree &t);//创建二叉树
void preordertraverse(bitree t);//先序遍历
void inordertraverse(bitree t);//中序遍历
void postordertraverse(bitree t);//后序遍历
int depth(bitree t);//求二叉树深度
int leaf(bitree t);//求二叉树叶子节点数
int main()
{
    int j,M,x;
bitree t;
   


printf("请输入:\n");
createbitree(t) ;  
printf("先序遍历的结果是:");
preordertraverse(t);
    printf("\n");
printf("中序遍历的结果是:");
inordertraverse(t);
    printf("\n");
printf("后序遍历的结果是:");
    postordertraverse(t);
printf("\n");
printf("叶子节点数是:");
x=leaf(t);
printf("%d\n",x);
M=depth(t);
printf("二叉树的深度是:");printf("%d\n",M);
return 0;
}


// 按先序次序输入二叉树中结点的值(一个字符),“#”字符表示空树,
  // 构造二叉链表表示的二叉树T。
int createbitree(bitree &t) 
{
char ch;
scanf("%c",&ch);
if(ch=='#') t=NULL;
else
{
if(!(t=(bitnode*)malloc(sizeof(bitnode)))) exit(0);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
}
return 0;
}
void preordertraverse(bitree t)
{
if(t)
{
printf("%c",t->data);
preordertraverse(t->lchild);
preordertraverse(t->rchild);
}
}
void inordertraverse(bitree t)
{
if(t)
{
inordertraverse(t->lchild);
printf("%c",t->data);
inordertraverse(t->rchild);
}
}
void postordertraverse(bitree t)
{
if(t)
{
postordertraverse(t->lchild);
postordertraverse(t->rchild);
printf("%c",t->data);
}
}
int leaf(bitree t)
{
   //int n=0;
if(t)
{
if(t->lchild==NULL&&t->rchild==NULL)
n=n+1;
leaf(t->lchild);
leaf(t->rchild);

}
return n;
}
int depth(bitree t) 
{
int dep1,dep2;
if(t==NULL)
return 0;
else
{
dep1=depth(t->lchild);
dep2=depth(t->rchild);
if(dep1>=dep2)
return (dep1+1);
else 
return (dep2+1);
}
}

0 0