二叉树,创建,打印,层序,先,中,后序递归及非递归遍历

目前只实现了这些
后面要去了解哈夫曼树,作业是编码文档并解码,需要这棵树

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

#define ElementType int
#define LEN 3

/**二叉树*/
typedef struct TreeNode{
    ElementType val;
    struct TreeNode *left;
    struct TreeNode *right;
}BiNode,*BiTree;

/**栈的定义*/
#define STACK_INIT_SIZE 100 //初始分配空间
#define STACKINCREMENT 10  //分配增量
#define OK 1
#define ERROR 0
#define SElemType BiTree
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
/*构造空栈*/
int InitStack(SqStack * SPtr);
/*销毁栈*/
int DestoryStack(SqStack * SPtr);
/*把栈置空*/
int ClearStack(SqStack * SPtr);
/*判空*/
int StackEmpty(SqStack S);
/*返回栈顶元素*/
int GetTop(SqStack S,SElemType * e);
/*入栈*/
int Push(SqStack * SPtr,SElemType e);
/*出栈*/
int Pop(SqStack * SPtr,SElemType * e);

/**队列定义*/
#define QElemType BiTree
#define MAXSIZE 40
typedef struct{
    QElemType *base;
    int front;
    int rear;
}Queue;
/*初始化队列*/
void InitQuene(Queue * QPtr);
/*入队*/
void EnQuene(Queue* QPtr,QElemType E);
/*出队*/
void DeQuene(Queue* QPtr,QElemType* E);
/*销毁队列*/
void DestoryQueue(Queue* QPtr);


/*创建二叉树*/
int CreateTree(BiTree* TPtr);
/*打印二叉树*/
void PrintTree(BiTree T,int i);
/*递归,前序遍历*/
void PreOrder(BiTree T);
/*非递归,先序遍历*/
void PreOrderPlus(BiTree T);
/*递归,中序遍历*/
void InOrder(BiTree T);
/*非递归,中序遍历*/
void InOrderPlus(BiTree T);
/*递归,后序遍历*/
void LaOrder(BiTree T);
/*非递归,后序遍历*/
void LaOrderPlus(BiTree T);
/*层序遍历*/
void LevelOrder(BiTree T);
/*求二叉树的深度*/
int Height(BiTree T);
/*求二叉树的节点数*/
int Count(BiTree T);

int main()
{
    BiTree T;//1 2 3 0 0 4 0 0 5 6 0 0 7 0 0
    CreateTree(&T);
    printf("创建完毕\n");
    PrintTree(T,LEN);
    printf("打印完毕\n");
    PreOrder(T);
    printf("前序递归完毕\n");
    PreOrderPlus(T);
    printf("前序非递归完毕\n");
    InOrder(T);
    printf("中序递归完毕\n");
    InOrderPlus(T);
    printf("中序非递归完毕\n");
    LaOrder(T);
    printf("后序递归完毕\n");
    LaOrderPlus(T);
    printf("后序非递归完毕\n");
    LevelOrder(T);
    printf("层序遍历完毕\n");
    int height;
    height = Height(T);
    printf("height = %d\n",height);
    int count;
    count = Count(T);
    printf("count = %d\n",count);
    return 0;
}


/*创建二叉树*/
int CreateTree(BiTree* TPtr)
{
    (*TPtr) = NULL; //初始化
    ElementType val;
    scanf("%d",&val);
    if(val == 0)
    {
        return 0;
    }
    else
    {
        (*TPtr) = (BiTree*)malloc(sizeof(BiNode));
        if(!TPtr) exit(0); //申请内存失败
        (*TPtr)->val = val;
        CreateTree(&((*TPtr)->left));
        CreateTree(&((*TPtr)->right));
    }
    return 1;
}
/*打印二叉树*/
void PrintTree(BiTree T,int i)
{
    if(T != NULL)
    {
        PrintTree(T->right,i+LEN);
        if(T->val != 0)
        {
            printf("%*d\n",i,T->val);
        }
        PrintTree(T->left,i+LEN);
        i -= LEN;
    }
}
/*递归,前序遍历*/
void PreOrder(BiTree T)
{
    if(T)
    {
        printf("%d\n",T->val);
        PreOrder(T->left);
        PreOrder(T->right);
    }
}
/*非递归,先序遍历*/
void PreOrderPlus(BiTree T)
{
    BiTree tem = T;
    /*创立及初始化栈*/
    SqStack S;
    SqStack * SPtr = &S;
    InitStack(SPtr);
    while(tem != NULL || !StackEmpty(S))//当栈空树也空,就应该结束循环了
    {
        while(tem != NULL)
        {
            printf("%d ",tem->val);
            Push(SPtr,tem);
            tem = tem->left;
        }
        if(!StackEmpty(S))
        {
            Pop(SPtr,&tem);
            tem = tem->right;
        }
    }
    DestoryStack(SPtr);
    printf("\n");
}
/*递归,中序遍历*/
void InOrder(BiTree T)
{
    if(T)
    {
        InOrder(T->left);
        printf("%d\n",T->val);
        InOrder(T->right);
    }
}
/*非递归,中序遍历*/
void InOrderPlus(BiTree T)
{
    BiTree tem = T;
    /*创立及初始化栈*/
    SqStack S;
    SqStack * SPtr = &S;
    InitStack(SPtr);
    /*栈空或树空退出*/
    while(tem != NULL || !StackEmpty(S))
    {
        /*将当前树及其左子全部入栈*/
        while(tem != NULL)
        {
            Push(SPtr,tem);
            tem = tem->left;
        }
        /*出栈一个,打印,寻找当前出栈点的右子*/
        if(!StackEmpty(S))
        {
            Pop(SPtr,&tem);
            printf("%d ",tem->val);
            tem = tem->right;
        }
    }
    DestoryStack(SPtr); //销毁栈
    printf("\n");
}
/*递归,后序遍历*/
void LaOrder(BiTree T)
{
    if(T)
    {
        LaOrder(T->left);
        LaOrder(T->right);
        printf("%d\n",T->val);
    }
}
/*非递归,后序遍历*/
void LaOrderPlus(BiTree T)
{
    if(!T) exit(0); //空,退出
    BiTree tem = T,cur = T;
    int flag;
    /*创立及初始化栈*/
    SqStack S;
    SqStack * SPtr = &S;
    InitStack(SPtr);
    Push(SPtr,tem); //根结点入栈
    /*栈空或树空退出*/
    while(!StackEmpty(S))
    {
        GetTop(S,&tem);
        /*flag是条件,当前节点是叶子或者其孩子已经遍历*/
        flag = ((tem->left == NULL && tem->right == NULL) || cur == tem->left || cur == tem->right);
        if(flag)
        {
            Pop(SPtr,&tem);
            printf("%d ",tem->val);
            cur = tem;
        }
        else
        {
            if(tem->right)
            {
                Push(SPtr,tem->right);
            }
            if(tem->left)
            {
                Push(SPtr,tem->left);
            }
        }
    }
    DestoryStack(SPtr); //销毁栈
    printf("\n");
}
/*层序遍历*/
void LevelOrder(BiTree T)
{
    if(!T) exit(-1);//空,退出
    BiTree tem = T;
    /*创建队列*/
    Queue Q;
    Queue* QPtr = &Q;
    InitQuene(QPtr);
    EnQuene(QPtr,tem);
    while(Q.front != Q.rear)//队列不空
    {
        DeQuene(QPtr,&tem);
        printf("%d ",tem->val);
        if(tem->left)
        {
            EnQuene(QPtr,tem->left);
        }
        if(tem->right)
        {
            EnQuene(QPtr,tem->right);
        }
    }
}
/*求二叉树的深度*/
int Height(BiTree T)
{
    int h_left,h_right;
    if(!T) return 0; //空,返回0,出口
    h_left = Height(T->left);
    h_right = Height(T->right);
    if(h_left>h_right)
    {
        return h_left+1;
    }
    else
    {
        return h_right+1;
    }
}
/*求二叉树的节点数*/
int Count(BiTree T)
{
    int r_count,l_count;
    if(!T) return 0; //出口
    printf("哭哭哭\n");
    r_count = Count(T->right);
    l_count = Count(T->left);
    return r_count+l_count+1;
}


















/*构造空栈*/
int InitStack(SqStack * SPtr)
{

    SPtr->base = (SElemType * )malloc(sizeof(SElemType)*STACK_INIT_SIZE);
    if(!SPtr->base) return ERROR; //申请内存失败,强制退出
    SPtr->top = SPtr->base;
    SPtr->stacksize = STACK_INIT_SIZE;//printf("函数内部SPtr->top = %p\n",SPtr->top);
    return OK;
}
/*销毁栈*/
int DestoryStack(SqStack * SPtr)
{
    if(!SPtr->base) return ERROR; //栈本来就为空
    free(SPtr->base);  //释放空间
    //printf("函数外S.top = %p,S.base = %p\n",SPtr->top,SPtr->base);
    SPtr->base = NULL;
    SPtr->top = NULL;
    SPtr->stacksize = 0;
    return OK;
}
/*把栈置空*/
int ClearStack(SqStack * SPtr)
{
    if(!SPtr->base) return ERROR; //栈空
    SPtr->top = SPtr->base;
    return OK;
}
/*判空*/
int StackEmpty(SqStack S)
{
    if(S.base == S.top)
        return OK;
    else
        return ERROR;
}
/*返回栈顶元素*/
int GetTop(SqStack S,SElemType * e)
{
    if(S.base == S.top) return ERROR; //空
    *e = *(S.top-1);
    return OK;
}
/*入栈*/
int Push(SqStack * SPtr,SElemType e)
{
    if(SPtr->top-SPtr->base >= SPtr->stacksize) //满
    {
        SPtr->base = (SElemType * )realloc(SPtr->base,(SPtr->stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!SPtr->base) return ERROR;  //申请失败,退出
        SPtr->top = SPtr->base+SPtr->stacksize; //relloc函数可能改变数据位置
        SPtr->stacksize += STACKINCREMENT;   //更新数据总数
    }
    *(SPtr->top++) = e;
    return OK;
}
/*出栈*/
int Pop(SqStack * SPtr,SElemType * e)
{
    if(SPtr->base == SPtr->top) return ERROR; //空
    *e = *(--SPtr->top);
    return OK;
}
/*初始化队列*/
void InitQuene(Queue * QPtr)
{
    QPtr->base = NULL;
    QPtr->base = (QElemType*)malloc(sizeof(QElemType)*MAXSIZE);//申请内存
    if(!(QPtr->base)) exit(0); //申请内存失败
    QPtr->front = 0;
    QPtr->rear = 0;
}
/*入队*/
void EnQuene(Queue* QPtr,QElemType E)
{
    if((QPtr->rear+1)%MAXSIZE == QPtr->front) //队满
    {
        printf("队满\n");
        exit(-1);
    }
    else
    {
        QPtr->base[QPtr->rear] = E;
        QPtr->rear = (QPtr->rear+1)%MAXSIZE;
    }
}
/*出队*/
void DeQuene(Queue* QPtr,QElemType* E)
{
    if(QPtr->front == QPtr->rear)
    {
        printf("队空\n");
        exit(-1);
    }
    else
    {
        (*E) = QPtr->base[QPtr->front];
        QPtr->front = (QPtr->front+1)%MAXSIZE;
    }
}
/*销毁队列*/
void DestoryQueue(Queue* QPtr)
{
    free(QPtr->base);
    QPtr->base = NULL;
    QPtr->front = 0;
    QPtr->rear = 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值