回 帖 发 新 帖 刷新版面

主题:求助~~~~高手进来看下~~~~

题目是《建立二叉数,层序、先序遍历》 要用《数据结构》跟《C语言》的知识做~~~
有会的吗?小弟不太懂啊~~~
向各位大侠求助~~~~~~~谢谢~~
小弟的邮箱sq160@126.com

回复列表 (共4个回复)

沙发

网上有数据结构(清华版)的算法实现,因为书上原来都是伪代码,有人做了完整的代码在网上,你可以找找..你的问题都是书上的例题

板凳

我找找看~
谢谢~

3 楼

层次,先序会,建树不会
树怎么建阿,是给出中序遍历,先(后)序遍历,建立一棵树,还是怎么建
要求说得清楚一点啊

4 楼

#include <stdlib.h>
#include <stdio.h>
#define queuesize 100
#define null 0
typedef char datatype;
typedef struct node{
    datatype data;
    struct node *lchild,*rchild;
}bintnode;//定义二叉链表结点结构
typedef bintnode *bintree;//定义二叉链表指针类型

typedef struct{
    int front,rear;
    bintree data[queuesize];//循环队列元素类型为二叉链表结点指针
    int count;
}cirqueue;//循环队列结构定义
void createbintree(bintree *);
void preorder(bintree );
void inorder(bintree );
void postorder(bintree );
void leverorder(bintree );

void main()//主函数
{//建立二叉树的二叉链表表示,并进行先序遍历、中序遍历、后序遍历和按层次遍历,
    bintree t=null;
    printf("please input nodes of bintree:\n");
    createbintree(&t);//建立二叉链表

    printf("the preorder is:");
    preorder(t);//对二叉树t进行先序遍历
    printf("\n");
    printf("the inorder is:");
    inorder(t);//对二叉树t进行中序遍历
    printf("\n");
    printf("the postorder is:");
    postorder(t);//对二叉树t进行后序遍历
    printf("\n");
    printf("the leverorder is:");
    leverorder(t);//对二叉树t进行按层次遍历
    printf("\n");
    
}
void createbintree(bintree *t)
{//输入二叉树的先序遍历序列,创建二叉链表
    char ch;
    if ((ch=getchar())==' ')//如果读入空格字符,创建空树
        *t=null;
    else
    {
        *t=(bintnode*)malloc(sizeof(bintnode));//申请根结点*t空间
        (*t)->data=ch;//将结点数据ch放入根结点的数据域
        createbintree(&(*t)->lchild);//建左子树
        createbintree(&(*t)->rchild);//建右子树
    }
}

void preorder(bintree t)
{//对二叉树进行先序遍历
    if(t)
    {
        printf("%c",t->data);
        preorder(t->lchild);
        preorder(t->rchild);
    }
}

void inorder(bintree t)
{//对二叉树进行中序遍历
    if(t)
    {
        inorder(t->lchild);
        printf("%c",t->data);
        inorder(t->rchild);
    }
}

void postorder(bintree t)
{//对二叉树进行后序遍历
    if(t)
    {
        postorder(t->lchild);
        postorder(t->rchild);
        printf("%c",t->data);
    }
}

error(char *message)
{//出错时,调用的返回出错信息,终止程序运行的函数
    fprintf(stderr,"error:%s\n",message);
    exit(1);
}

void leverorder(bintree t)
{
    cirqueue *q;
    bintree p=t;
    q=(cirqueue*)malloc(sizeof(cirqueue));//申请循环队列空间
    q->rear=q->front=q->count=0;//将循环队列初始化为空
    q->data[q->rear]=t;q->count++;q->rear=(q->rear+1)%queuesize;//将根结点入队
    while(q->count)//若队列不为空,做以下操作
        if (q->data[q->front])//当队首元素不为空指针,做以下操作
        {
            p=q->data[q->front];//取队首元素*p
            printf("%c",q->data[q->front]->data);//打印*p结点的数据域信息
            q->front=(q->front+1)%queuesize;q->count--;//队首元素出队
            if (q->count==queuesize)//若队列为队满,则打印队满信息,退出程序的执行
                error("the queue is full!");
            else
            {//若队列不满,将*p结点的左孩子指针入队
                q->count++;q->data[q->rear]=p->lchild;
                q->rear=(q->rear+1)%queuesize;
            }
            if (q->count==queuesize)
                error("the queue full!");
            else{//若队列不满,将*p结点的右孩子指针入队
                q->count++;q->data[q->rear]=p->rchild;
                q->rear=(q->rear+1)%queuesize;
            }
        }
        else{//当队首元素为空指针,将空指针出队
            q->front=(q->front+1)%queuesize;q->count--;
        }
}

int nodes(bintree t)
{
    if (!t)//若二叉树为空树 
        return 0;//返回结点数0
    else//若二叉树非空
        return nodes(t->lchild)+nodes(t->rchild)+1;
    //二叉树的结点总数为左、右子树的结点总数加上1(根结点)
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册