二叉树

/*二叉树的应用*/
#define NULL 0
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;   /*左右孩子指针*/
   }BiTNode,*BiTree;
int Initiate (BiTree  *bt)
                   /*初始化建立二叉树*bt的头结点*/
     { if((*bt=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
                   return 0;
       (*bt)->lchild=NULL;
       (*bt)->rchild=NULL;
       return 1;
      }
BiTree Create(char x,BiTree lbt,BiTree rbt)
           /*生成一棵以x为根结点的数据域值以lbt和rbt为左右子树的二叉树*/
      { BiTree  p;
         if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
                   return NULL;
         p->data=x;
         p->lchild=lbt;
         p->rchild=rbt;
         return p;
       }
BiTree InsertL(BiTree bt,char x,BiTree parent)
     /*在二叉树bt的结点parent的左子树插入结点数据元素x*/
     {  BiTree  p;
         if (parent==NULL)  {
             printf("/n插入出错");
             return NULL;  }
         if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
             return NULL;
         p->data=x;
         p->lchild=NULL;  p->rchild=NULL;
         if (parent->lchild==NULL)   parent->lchild=p;
          else  { p->lchild=parent->lchild;
                     parent->lchild=p; }
         return bt;
      }
BiTree InsertR(BiTree bt,char x,BiTree parent)
     /*在二叉树bt的结点parent的左子树插入结点数据元素x*/
     {  BiTree  p;
         if (parent==NULL)  {
             printf("/n插入出错");
             return NULL;  }
         if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
             return NULL;
         p->data=x;
         p->lchild=NULL;  p->rchild=NULL;
         if (parent->rchild==NULL)   parent->rchild=p;
          else  { p->rchild=parent->rchild;
                     parent->rchild=p; }
         return bt;
      }
BiTree  DeleteL(BiTree bt,BiTree parent)
                /*在二叉树bt中删除结点parent的左子树*/
     { BiTree  p;
        if (parent==NULL||parent->lchild==NULL) {
              printf("/n删除出错");
              return NULL;  }
        p=parent->lchild;
        parent->lchild=NULL;
      free(p);  /*当p为非叶子结点时,这样删除仅释放了所删子树根结点的空间,若要删除子树分支中的结点,需用后面介绍的遍历操作来实现。*/
        return bt;
      }
void PreOrder(BiTree bt) /*先序遍历二叉树bt*/
  { if (bt==NULL) return;     /*递归调用的结束条件*/
     printf("%c ",bt->data);       /*访问结点的数据域*/
     PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
     PreOrder(bt->rchild);
      /*先序递归遍历bt的右子树*/ 
 }
void InOrder(BiTree bt) /*先序遍历二叉树bt*/
  { if (bt==NULL) return;     /*递归调用的结束条件*/
     InOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
     printf("%c ",bt->data);       /*访问结点的数据域*/
     InOrder(bt->rchild);
      /*先序递归遍历bt的右子树*/ 
 }
BiTree Search(BiTree bt,char x)
  {BiTree p;
    if(bt){
        if(bt->data==x)
        return bt;
           if(bt->lchild!=NULL)
           return(Search(bt->lchild,x));
              if(bt->rchild!=NULL)
              return(Search(bt->rchild,x));
    }
 }             
main()
{
 BiTree t,p;
 clrscr();
 Initiate(&t);
 p=Create('F',NULL,NULL);
 p=Create('E',NULL,p);
 t=Create('D',NULL,NULL);
 p=Create('B',t,p);
 t=Create('G',NULL,NULL);
 t=Create('C',NULL,t);
 p=Create('A',p,t);
 p=InsertL(p,'H',p->rchild);
 p=InsertR(p,'M',p->rchild);
 /*printf("%c/n",p->data);
 printf("%c/n",p->lchild->data);
 printf("%c/n",p->rchild->data);
 printf("%c/n",p->rchild->lchild->data);
 printf("%c/n",p->rchild->rchild->data);*/
 PreOrder(p); printf("/n");
 InOrder(p); printf("/n");
 t=Search(p,'D');
 if(t)
   printf("found/n");
 else
   printf("no/n");
 }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值