二叉树部分程序

问题描述:

建立二叉树,对二叉树求叶子树和层数,进行中序递归和非递归遍历,和层序遍历,以及先序和后序递归遍历。

源代码:

#include"stdio.h"
#include"stdlib.h"
#define MAXSIZE 30

typedef struct BiThTree
{
 char data;
    struct BiThTree *lchild,*rchild;
}BiTreeNode;


int ye;

void InitBiTree(BiTreeNode **Bt)
{
 *Bt=(BiTreeNode *)malloc(sizeof(BiTreeNode));
 (*Bt)->lchild=(*Bt)->rchild=NULL;
}


BiTreeNode *CreatBiTree(BiTreeNode **Bt,char *tr)
{
 BiTreeNode *p[MAXSIZE],*q=NULL;
 int i=0,k;
 int top=-1;
 *Bt=NULL;

 while(tr[i]!='/0')
 {
       switch(tr[i])
    {
         case'(':
       k=1;//对左孩子进行操作
    top++;
                p[top]=q;
       break;
           
   case')':
       top--;
       break;

       case',':
    k=2;
    break;
      default:
       q=(BiTreeNode *)malloc(sizeof(BiTreeNode));
       q->data=tr[i];
       q->lchild=q->rchild=NULL;
    if(*Bt==NULL)
     *Bt=q;
    else if(k==1)
     p[top]->lchild=q;
                else if(k==2)
     p[top]->rchild=q;
       break;
    }
    i++;
 }
 return *Bt;
}

//按中序遍历二叉树 递归算法
int InorderBiTree(BiTreeNode *Bt)
{
 BiTreeNode *p=Bt;

 if(p==NULL)
     return 0;
    else
 {
  InorderBiTree(p->lchild);
  printf("%c ",p->data);
  InorderBiTree(p->rchild);
 }
 return 1;
}

int PreorderBiTree(BiTreeNode *Bt)
{

 BiTreeNode *p=Bt;
 if(p!=NULL)
 {
     printf("%c",p->data);
  PreorderBiTree(p->lchild);
  PreorderBiTree(p->rchild);
 }
 

 return 1;
}//先序递归遍历

int PostorderBiTree(BiTreeNode *Bt)
{
 BiTreeNode *p=Bt;

 if(p!=NULL)
 {
  PostorderBiTree(p->lchild);
  PostorderBiTree(p->rchild);
  printf("%c",p->data);
 }
 printf("/n");
 return 1;
}//后序递归遍历

 

//按中序遍历二叉树  非递归算法
void FeiBiTree(BiTreeNode *Bt)
{
 int top=0;
 BiTreeNode *s[MAXSIZE];
 BiTreeNode *p=Bt;
 

 while(top>-1)
 {
     if(p!=NULL)
  {
      s[top]=p;
   top++;
            p=p->lchild;
  }
   
  else
  {
   top--;
   if(top>-1)
   {
        p=s[top];
       printf("%3c",p->data);
           p=p->rchild;
   }
  }
 }
 printf("/n");
}


  
  
 


void CengBiTree(BiTreeNode *Bt)
{
 BiTreeNode *p=Bt,*q=NULL;
    BiTreeNode *s[MAXSIZE];
 int front=0,rear=0;
   
 printf("层序遍历结果:/n");
    if(p!=NULL)
 {
     front=(front+1)%MAXSIZE;
  s[front]=p;
 }
 while(rear!=front)
 {
  rear=(rear+1)%MAXSIZE;
  printf("%2c",s[rear]->data);
  p=s[rear];
  if(p->lchild)
  {
   front=(front+1)%MAXSIZE;
   s[front]=p->lchild;
  }
  if(p->rchild)
  {
         front=(front+1)%MAXSIZE;
   s[front]=p->rchild;
  }
   
 }
}

 
  

 


 


//求二叉树的深度
int DepthBiTree(BiTreeNode *Bt)
{
 BiTreeNode *p=Bt;
 int dep=0,lh=0,rh=0;


    if(p!=NULL)
 {
  lh=DepthBiTree(p->lchild);
  rh=DepthBiTree(p->rchild);
  dep=(lh>rh)?(++lh):(++rh);
        return dep;
 }
 else return 0;
}


//求二叉树的树叶
int YeshuBiTree(BiTreeNode *Bt)
{
 BiTreeNode *p=Bt;


 if(p==NULL)
  return 0;
 else
 {
  
     if((p->lchild==NULL)&&(p->rchild==NULL))
  ye++;
        YeshuBiTree(p->lchild);
     YeshuBiTree(p->rchild);
 }
    return ye;
}

void main()
{
 BiTreeNode *BTr=NULL;
 char TR[MAXSIZE];
 int ye,gao,n;

 printf("建立一个二叉树!/n");
 printf("请输入二叉树的字符序列串:/n");
 scanf("%s",TR);
 
 InitBiTree(&BTr);
 BTr=CreatBiTree(&BTr,TR);
 do{
     printf("请选择:/n");
     printf("---------------*********************----------------/n/n");
     printf("/t/t中序递归遍历二叉树---1:/n/n");
     printf("/t/t中序非递归遍历二叉树---2:/n/n");
     printf("/t/t层序遍历二叉树---3:/n/n");
     printf("/t/t求树的高度---4:/n/n");
     printf("/t/t求树的叶子数---5:/n");
     printf("/t/t退出该程序---6/n/n");
      printf("---------------*********************---------------/n/n");
     scanf("%d",&n);
        switch(n)
    {
         case 1:
       InorderBiTree(BTr);
       break;
      case 2:
                FeiBiTree(BTr);
       break;
      case 3:
        CengBiTree(BTr);
       break;
      case 4:
        gao=DepthBiTree(BTr);
       printf("/n该二叉树的高为:%d/n",gao);
       break;
      case 5:
             ye=YeshuBiTree(BTr);
             printf("该二叉树的叶数为:%d/n",ye);
       break;
      case 6:
       exit(0);
  }
 }while(n!=6);
}

 

 

 

 

 

 

 

 


 


      

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值