实验六 二叉树的递归遍历及其应用

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

#define ERROR 0
#define MaxSize 100

typedef char ElemType;
typedef struct node
{
    ElemType data;           /*结点的数据元素*/
    struct node *lchild;     /*指向左孩子*/
    struct node *rchild;     /*指向右孩子*/
}BTNode;                     /*定义二叉树存储结构*/

/*建立二叉树*/
BTNode *CreateBTNode(char *nodes,int pos,int num)
{
    BTNode *p;
    if(nodes[pos]=='\0'||pos>num)
        return NULL;
     p=(BTNode *)malloc(sizeof(BTNode));     /*建立根结点*/
     if(!p)
     return ERROR;
     p->data=nodes[pos];
     p->lchild=CreateBTNode(nodes,2*pos,num);       /*递归建立左子树*/
     p->rchild=CreateBTNode(nodes,2*pos+1,num);     /*递归建立右子树*/
     return p;
}

/*非递归中序遍历二叉树*/
void InOrder(BTNode *b)
{
    BTNode *st[MaxSize],*p;
    int top=-1;
    if(b!=NULL)
    {
        p=b;
        while(top>-1||p!=NULL)
        {
            while(p!=NULL)
            {
                top++;
                st[top]=p;
                p=p->lchild;
            }
            if(top>-1)
            {
                p=st[top];
                top--;
                printf("%c",p->data);
                p=p->rchild;
            }
        }
        printf("\n");
    }
}

 /*递归中序遍历二叉树*/
void  InOrder1(BTNode *b)
{
    if(b!=NULL)
    {
        InOrder1(b->lchild);    /*递归遍历左子树*/
        printf("%c",b->data);
        InOrder1(b->rchild);     /*递归遍历右子树*/
    }
}

/*求二叉树的高度*/
int BTNodeDepth(BTNode *b)
{
    int lchilddep,rchilddep;
    if(b==NULL)
        return 0;
    else
    {
        lchilddep=BTNodeDepth(b->lchild);  /*求左子树的高度*/
        rchilddep=BTNodeDepth(b->rchild);  /*求右子树的高度*/
        if(lchilddep>rchilddep)
            return  lchilddep+1;
        else
            return rchilddep+1;
    }
}
/*用分层形式输出二叉树*/
void DispBTNode(BTNode *b)
{
    BTNode *qu[MaxSize];
    BTNode *p;
    int front,rear,n;
    n=0;
    front=rear=0;
    qu[rear++]=NULL;
    p=b;
    if(p!=NULL)
        qu[rear++]=p;
    do{
        p=qu[front++];
        if(p==NULL)
        {
            qu[rear++]=NULL;
            n++;
            printf("\n");
        }
        else
        {
            printf("(%d,%2c)",n,p->data);
            if(p->lchild!=NULL)
                qu[rear++]=p->lchild;
             if(p->rchild!=NULL)
                qu[rear++]=p->rchild;
        }
    }while(front!=rear-1);
}


void main()
{
    BTNode *b;
    char nodes[]="#ABCDEF##G##H###";     /*直接用数组生成二叉树*/
    b=CreateBTNode(nodes,1,15);
    printf("\n");
    DispBTNode(b);
    printf("\n");
    getch();
    printf("InOrder: ");
    InOrder(b);
    getch();
    printf("InOrder1:");
    InOrder1(b);
    getch();
    printf("\n");
    printf("Depth:%d\n",BTNodeDepth(b));
    getch();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值