#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *lch, *rch;
} Bnode, *BiTree;
Bnode *creat() //用性质5生成二叉树的二叉链表、 、该函数要返回根结点,根结点是个指针 ,所以用*creat
//性质五 :若对含 n 个结点的完全二叉树从上到下且从左至右进行1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有:
// (1)若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 【i/2】的结点为其双亲结点;
// (2)若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;
// (3)若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点
//如果i为偶数,则它是双亲结点的左孩子,即让s[j]->lch = s[i];
//如果i为奇数,则它是双亲结点的右孩子,即让s[j]->rch = s[i]。
//就是这样将新输入的结点逐一与其双亲结点相连,生成二叉树。
{
Bnode *t=NULL;//t是根结点,起初使根结点为空
int i,x,j;
Bnode *s[20];//s为指向结点的指针类型Bnode* ,最大长度为20
Bnode *q;
printf("\n i,x=");scanf("%d,%d",&i,&x);//输入结点时,要按照从小到大的顺序,这样才便于确定双亲与孩子的关系(性质五的原理)
while ((i!=0)&&(x!=0))//i与x有一个为零时停止循环
{ q=(Bnode*)malloc(sizeof(Bnode));//malloc()为创建一块长度为sizeof(Bnode)字节的连续区域 。该区域类型为指向结点的指针类型Bnode*
/*产生一个结点*/
q->data=x; q->lch=NULL; q->rch=NULL;
s[i]=q;//i是结点编号 ,指向该结点的指针存入s[i]
if (i==1) t=q; /*i为1时,q为树根结点*/
else
{
j=i/2; /*j为双亲结点编号*/
if ((i%2)==0) s[j]->lch=q;//如果i是偶数则q为左孩子
else s[j]->rch=q;
}
printf("\n i,x=");scanf("%d,%d",&i,&x);
}
return t;
} /* creat end */
void preorder (BiTree T)//先序遍历
{
if (T)
{
printf("%d ",T->data);
preorder (T->lch);
preorder (T->rch);
}
}
void inorder(BiTree T)//中序遍历
{
if (T)
{
inorder (T->lch);
printf("%d ",T->data);
inorder (T->rch);
}
}
void postorder(BiTree T)//后序遍历
{
if (T)
{
postorder (T->lch);
postorder (T->rch);
printf("%d ",T->data);
}
}
int NodeCount(BiTree T)//二叉树结点的统计
{
if(T == NULL ) return 0;
else return NodeCount(T->lch)+NodeCount(T->rch)+1;//递归调用。1是根结点
}
int Depth(BiTree T) //二叉树深度的统计
{
int m,n;
if(T==NULL) return 0;
else
{
m=Depth(T->lch);
n=Depth(T->rch);
if(m>n) return (m+1);//将最大的数视为二叉树的深度
else return(n+1);
}
}
int LeafCount(BiTree T)//二叉树叶子结点的统计
{
if(T==NULL) //如果是空树返回0
return 0;
if (T->lch== NULL && T->rch == NULL)
return 1; //如果是叶子(没有左右孩子)结点返回1
else return LeafCount(T->lch) + LeafCount(T->rch);//有孩子,就递归调用,
}
int main()
{
Bnode *t;//定义t为指向结点的指针类型Bnode*
t=creat();//用性质五创建二叉树,但没有输出
preorder(t);
printf("\n");
inorder(t);
printf("\n");
postorder(t);
printf("\n");
printf("%d\n",NodeCount(t));
printf("%d\n",LeafCount(t));
printf("%d",Depth(t));
}
用性质五创建二叉树
最新推荐文章于 2024-10-19 19:51:37 发布
这篇文章描述了如何使用C语言基于性质五构建完全二叉树,通过动态内存分配创建结点,并提供了先序、中序和后序遍历的函数。此外,还包含了计算树中结点数、深度和叶子结点数的函数。
摘要由CSDN通过智能技术生成