数与二叉数

实验目的:
1.熟悉树的各种存储结构的特性
2.掌握采用二叉链表作为存储结构的树的相关算法
实验内容:
***1.按先序序列构造二叉链表(CreatBiTree),
***2.实现函数用于计算结点的总个数(CountNode)
***3.实现函数用于计算叶子结点的个数(CountLeaf)
***4. 实现函数(InOrder)用于输出中序遍历序列
5.实现函数(PostOrder)用于输出后序遍历序列
6.函数(NRPreOrder)用于非递归方法输出先序序列//可选做

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct node
{ char  data;
  struct node *lchild,*rchild;
}BitNode,*BitTree; 

/*按先序遍历序列输入树上的元素,生成二叉链表*/
void creatTree(BitTree &T)
{
 char ch;                         /*ch代表输入的元素*/
 scanf("%c",&ch);
  /*用空格来扩展树,所以读到空格代表没有孩子结点*/
 if(ch==' ') T=NULL;             
   else 
     {T=(BitNode *)malloc(sizeof(BitNode));
      T->data=ch;
      creatTree(T->lchild);
      creatTree(T->rchild);
     } 
}

/*输出中序遍历序列*/
void inorder(BitTree T)
{if(T!=NULL)
   {
   inorder(T->lchild);
   printf("%c",T->data);
   inorder(T->rchild);
    }
}
/*输出后序遍历序列*/
void postorder(BitTree T)
{if(T!=NULL)
   {postorder(T->lchild);
    postorder(T->rchild);
    printf("%c",T->data);
   }
}

/*计算结点的总个数*/
int  nodes(BitTree T)
{ 
    int num1,num2;
  if(T==NULL)  return  0;
  else 
    {num1=nodes(T->lchild);
      num2=nodes(T->rchild);
         return (num1+num2+1 );
        }
}

/*计算叶子结点的个数*/
int leafs(BitTree T)
{ int num1,num2;
  if(T==NULL)  return  0;
  else if(T->lchild==NULL&&T->rchild==NULL)  return 1;
  else  {num1=leafs(T->lchild);
         num2=leafs(T->rchild);
         return (num1+num2);
        }
}

void ShowSelect()
{   printf("\n\n请选择要执行的操作:\n");
    printf("-------------------------\n");
    printf(" 1----先序序列构建二叉链表\n");
    printf(" 2----计算二叉树结点总个数\n");
    printf(" 3----计算叶子结点总个数\n");
    printf(" 4----输出中序遍历序列\n");
    printf(" 5----输出后续遍历序列\n");
    printf(" 0---- exit!\n");
    printf("-------------------------\n");
    printf("please input number 0~~6 \n\n");
}

void  main()
  { BitTree tree=NULL;
    int num;
   while(1)
  { ShowSelect();  
    scanf("%d",&num);
    getchar();
    switch(num){
	      case 1:{printf("请按先序序列建立二叉链表,以字符空格作为无孩子结点标志");
                  creatTree(tree);
                  break;
	              }
              case 2:{  int num;
                        num=nodes(tree);
                        printf("树的结点总个数为%d",num);
						break;
                      }
              case 3:{  int num;
                        num=leafs(tree);
                        printf("\n树的叶子结点个数为%d",num);
						break;
                      }
              case 4:{printf("\n中序遍历序列为:");
                      inorder(tree);
					  break;
                      }
              case 5:{printf("\n后序遍历序列为:");
                      postorder(tree);
					  break;
                      }
              case 0:
		      exit(0);
                }
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值