算法与数据结构考研试题精析-第6章算法设计题10

写一非递归算法,将数组转化为二叉链表表示的二叉树

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 20
typedef int Status;

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct
{
    int pos;
    BiTree t;
}Stack;

void CreateList(char *w,int n);
void CreateBiTree(BiTree *T,char *w,int n);
Status PreOrderTraverse(BiTree T);
Status Visit(char e);

int sum=0;

int main()
{
    int n;
    char *w;

    printf("有多少项:");
    scanf("%d",&n);
    w=(char *)malloc(sizeof(char)*(n+1));
    CreateList(w,n);
    BiTree *T;
    T=(BiTree*)malloc(sizeof(BiTree));
    CreateBiTree(T,w,n);
    printf("\n前序遍历结果:");
    PreOrderTraverse(*T);

    return 0;
}
//---创建线性表---//
void CreateList(char *w,int n)
{
    int i;
    for(i=1;i<=n;i++)
    {
        fflush(stdin);
        printf("请输入第%d项:",i);
        scanf("%c",&w[i]);
    }
}
//---按从上往下层创建二叉树---//
void CreateBiTree(BiTree *T,char *w,int n)
{
    Stack S[MAXSIZE+1];
    int top=0;

    *T=(BiTree)malloc(sizeof(BiTNode));
    (*T)->data=w[1];
    top++;
    S[top].t=*T;
    S[top].pos=1;

    while(top)
    {
        S[0]=S[top--];
        int pos;
        pos=S[0].pos;

        if(2*pos<=n && w[2*pos]!='#')
        {
            BiTree p;
            p=(BiTree)malloc(sizeof(BiTNode));
            p->data=w[2*pos];
            S[0].t->lchild=p;

            top++;
            S[top].t=p;
            S[top].pos=2*pos;
        }
        else
            S[0].t->lchild=NULL;
        if(2*pos+1<=n && w[2*pos+1]!='#')
        {
            BiTree p;
            p=(BiTree)malloc(sizeof(BiTNode));
            p->data=w[2*pos+1];
            S[0].t->rchild=p;

            top++;
            S[top].t=p;
            S[top].pos=2*pos+1;
        }
        else
            S[0].t->rchild=NULL;
    }
}
Status Visit(char e)
{
    printf("%c ",e);
    return OK;
}
//---前序遍历二叉树---//
Status PreOrderTraverse(BiTree T)
{
    if(T)
    {
        if(Visit(T->data))
            if(PreOrderTraverse(T->lchild))
                if(PreOrderTraverse(T->rchild))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值