二叉树的基本操作

一,源代码

#include <stdio.h>  

#include <stdlib.h>  

#define OK 1

#define OVERFLOW -1

#define ERROR 0

typedef int TElemType;

typedef int QElemType;

typedef int Status;

  

typedef struct BiTNode{  

    TElemType data;  

    struct BiTNode *lchild;  

    struct BiTNode *rchild;  

}BiTNode,*BiTree;

 

typedef struct QNode{  

    struct BiTNode *BiTNode;  

    struct QNode *next;  

}QNode,*QueuePtr;   

typedef struct {  

    QueuePtr front;

    QueuePtr rear;

}LinkQueue;   

//创建二叉树  

Status CreateTree(BiTree *T)  

{  

    char ch;  

    scanf("%c", &ch);  

    if (ch=='*')  

    {  

        *T = NULL;  

    }  

    else  

    {  

        *T = (BiTree)malloc(sizeof(BiTNode));  

        (*T)->data = ch;  

        CreateTree(&(*T)->lchild);  

        CreateTree(&(*T)->rchild);  

    }  

    //return OK;

}  

  

//两数较大值  

Status MaxOfTwo(int a, int b)  

{  

    if (a >= b)  

    {  

        return a;  

    }   

    else  

    {  

        return b;  

    }  

}  

  

//获得二叉树的高度  

int GetHeight(BiTree T)  

{  

    if (T)  

    {  

        return MaxOfTwo(GetHeight(T->lchild), GetHeight(T->rchild)) + 1;  

    }   

    else  

    {  

        return 0;  

    }  

}  

   

//获得二叉树的叶子节点数  

Status GetNodeNumber(BiTree T)  

{  

    if (T==NULL)  

return 0;

If(T->lchild==NULL&&T->rchild==NULL)

return 1;

    return GetNodeNumber(T->lchild) + GetNodeNumber(T->rchild);  

}  

  

//前序遍历  

Status PreOrderTraverse(BiTree T)  

{  

    if (!T)  

    {  

        return 0;  

    }    

    printf("%c ", T->data);  

    PreOrderTraverse(T->lchild);  

    PreOrderTraverse(T->rchild);  

}  

  

//中序遍历  

Status InOrderTraverse(BiTree T)  

{  

    if (!T)  

    {  

        return 0;  

    }   

    InOrderTraverse(T->lchild);  

    printf("%c ", T->data);  

    InOrderTraverse(T->rchild);  

}  

  

//后序遍历  

Status PostOrderTraverse(BiTree T)  

{  

    if (!T)  

    {  

        return 0;  

    }   

    PostOrderTraverse(T->lchild);  

    PostOrderTraverse(T->rchild);  

    printf("%c ", T->data);  

}  

  

//初始化队列  

Status InitQueue(LinkQueue &Q){

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front) exit(OVERFLOW);

Q.front->next=NULL;

return OK;

}

  

//队列是否为空  

Status QueueEmpty(LinkQueue Q){

if(Q.front==Q.rear)

return OK;

else

return ERROR;

}

  

//进队  

Status EnQueue(LinkQueue &Q, BiTree p){

QueuePtr s;

s=(QueuePtr)malloc(sizeof(QNode));

if(!p) exit(OVERFLOW);

s->BiTNode=p; s->next=NULL;

Q.rear->next=s;

Q.rear=s;

return OK;

}

  

//出队  

Status DeQueue(LinkQueue &Q,BiTree *p){

QueuePtr s;

if(Q.front==Q.rear) return ERROR;

s=Q.front->next;

*p=s->BiTNode;

Q.front->next=s->next;

if(Q.rear==s) Q.rear=Q.front;

free(s);

return OK;

}

//层序遍历

Status LevelOrderTraver(BiTree T)  

{

LinkQueue Q;

BiTree p;

InitQueue(Q);

p=T;

EnQueue(Q,p);

while(!QueueEmpty(Q))

{

DeQueue(Q,&p);

printf("%3c",p->data);

if(p->lchild)

EnQueue(Q,p->lchild);

    if(p->rchild)

    EnQueue(Q,p->rchild);

}

}  

//清除二叉树  

Status ClearTree(BiTree *T)  

{  

    if (!*T)  

    {  

        return 0;  

    }  

  

    ClearTree(&(*T)->lchild);  

    ClearTree(&(*T)->rchild);  

    free(*T);  

    *T = NULL;  

}   

//二叉树是否为空  

bool IsTreeEmpty(BiTree T)  

{  

    if (T)  

    {  

        return false;  

    }   

    else  

    {  

        return true;  

    }  

}      

int main(void)

{

int n;

BiTree t;

for(;;)

{

printf("**************菜单*****************\n");

printf("*        1.创建二叉树             *\n");

printf("*        2.二叉树的深度           *\n");

printf("*        3.二叉树节点数           *\n");

printf("*        4.前序遍历二叉树         *\n");

printf("*        5.中序遍历二叉树         *\n");

printf("*        6.后序遍历二叉树         *\n");

printf("*        7.层序遍历二叉树         *\n");

printf("*        8.清空二叉树             *\n");

printf("***********************************\n");

printf("请输入你的选择(1-8):\n");

scanf("%d",&n);

        fflush(stdin);

switch(n)

{

case 1:

printf("输入二叉树的前序遍历序列,用*代替空节点:\n");  

CreateTree(&t);

printf("二叉树构建成功\n");

break;

case 2:

printf("二叉树深度为:%d",GetHeight(t));

printf("\n");

break;

case 3:

printf("二叉树的节点数为:%d",GetNodeNumber(t));

printf("\n");

break;

case 4:

printf("前序遍历:");

PreOrderTraverse(t);

printf("\n");

break;

case 5:

printf("中序遍历:");

InOrderTraverse(t);

printf("\n");

break;

case 6:

      printf("后序遍历:");

      PostOrderTraverse(t);

      printf("\n");

break;

case 7:

printf("层序遍历:");

    LevelOrderTraver(t);

printf("\n");

break;

case 8:

ClearTree(&t);  

                if (IsTreeEmpty(t))  

               {  

                 printf("\n\n二叉树已经删除。\n");  

               }  

break;

   }

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3111215/blog/800379

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值