用性质五创建二叉树

这篇文章描述了如何使用C语言基于性质五构建完全二叉树,通过动态内存分配创建结点,并提供了先序、中序和后序遍历的函数。此外,还包含了计算树中结点数、深度和叶子结点数的函数。
摘要由CSDN通过智能技术生成
#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));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值