二叉树的建立及其基本操作

实验内容:

1、按照前序次序建立一棵二叉树;

2、用前、中、后序递归遍历的方法遍历二叉树;

3、求二叉树的深度;

4、求二叉树的所有结点数;

实验基本要求

掌握二叉树的链式存储结构的建立方法和对二叉树的各种操作算法

 

#include <stdio.h>

#include <malloc.h>

#define MaxSize 100

typedef char ElemType;
/*二叉树的链式存储结构*/
typedef struct node
{
        ElemType data;
        struct node *lchild;                    
  struct node *rchild;
} BTNode;

 

/*创建二叉树CreateBTNode(*b,*str) */
void CreateBTNode(BTNode * &b,char *str)/*由str串创建二叉链*/
{    
  BTNode *St[MaxSize],*p=NULL;
        int top=-1,k,j=0; 
        char ch;
        b=NULL; /*建立的二叉树初始时为空*/
        ch=str[j];
        while (ch!='\0')   /*str未扫描完时循环*/
        {
           switch(ch)
              {
      case '(':top++;St[top]=p;k=1; break;  /*为左孩子结点*/
      case ')':top--;break;
      case ',':k=2; break;                        
   /*为孩子结点右结点*/
            default:p=(BTNode *)malloc(sizeof(BTNode));
           p->data=ch;p->lchild=p->rchild=NULL;
            if (b==NULL)    /**p为二叉树的根结点*/
                b=p;
            else    /*已建立二叉树根结点*/
                     {    switch(k)
                          {
                case 1:St[top]->lchild=p;break;
                 case 2:St[top]->rchild=p;break;
                    }              
     }
               }
        j++;
     ch=str[j];
          }
}


/*先序遍历的递归算法*/
void PreOrder(BTNode *b)
{
 if(b!=NULL)
 {
  printf("%c",b->data);
     PreOrder(b->lchild);
  PreOrder(b->rchild);
 }
}


/*中序遍历的递归算法*/
void InOrder(BTNode *b)
{
 if(b!=NULL)
 {
  PreOrder(b->lchild);
  printf("%c",b->data);
  PreOrder(b->rchild);
 }
}


/*后序遍历的递归算法*/
void PostOrder(BTNode *b)
{
 if(b!=NULL)
 { 
     PreOrder(b->lchild);
  PreOrder(b->rchild);
  printf("%c",b->data);
 }
}

 

/*求高度BTNodeDepth(*b)*/
int BTNodeDepth(BTNode *b)
{     int lchilddep,rchilddep;
      if (b==NULL) return(0); /*空树的高度为0*/
      else 
      {     lchilddep=BTNodeDepth(b->lchild); 
  /*求左子树的高度为lchilddep*/
    rchilddep=BTNodeDepth(b->rchild); 
  /*求右子树的高度为rchilddep*/
  return(lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
      }
}


/*求二叉树的所有结点个数*/

int Nodes(BTNode *b)
{
 int num1,num2;
 if(b==NULL)   /*树空的情况*/
  return 0;
 else if(b->lchild==NULL&&b->rchild==NULL)/*为叶子结点的情况*/
  return 1;
 else
 {
  num1=Nodes(b->lchild);
  num2=Nodes(b->rchild);
  return(num1+num2+1); /*返回左右子树结点数加1*/
 }
}

void main()
{
 BTNode *b;
 CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
 printf("用括号表示法来表示这棵二叉树:“A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”");printf("\n\n");
 printf("(1)二叉树的深度:%d\n",BTNodeDepth(b));printf("\n");
 printf("(2)二叉树的所有结点个数:%d\n",Nodes(b));printf("\n");
 printf("(3)二叉树先序遍历序列:");PreOrder(b);printf("\n\n");
 printf("(4)二叉树中序遍历序列:");InOrder(b);printf("\n\n");
 printf("(5)二叉树后序遍历序列:");PostOrder(b);printf("\n\n");
 printf("\n");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值