码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树先序中序后序的递归及非递归遍历

时间:2017-12-23 21:39:45      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:treenode   last   set   返回   struct   init   style   ini   节点   

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

typedef struct treenode      //树的节点
{
    char data ;
    treenode * leftchild, * rightchild ;
}TreeNode;

typedef TreeNode * StackElemType ;   //定义栈包含的数据类型

typedef struct stacknode    //栈的节点
{
    StackElemType data ;
    stacknode * next ;
}StackNode;

typedef TreeNode * QueueElemType ;     //定义队列包含的数据类型

typedef struct queuenode     //定义队列节点
{
    QueueElemType  data ;
    struct queuenode * next ;
}QueueNode;

typedef struct queuehead    //定义队列的头节点
{
    QueueNode * front, * rear ;
}QueueHead;

//stack的有关声明
StackNode * InitStack(StackNode * S) ;
void StackPush(StackNode * S, StackElemType data) ;
void StackPop(StackNode * S, StackElemType & data) ;
int StackEmpty(StackNode * S) ;
int StackGetTop(StackNode * S, StackElemType & data) ;

//queue的有关声明
QueueHead * InitQueue(QueueHead * Q) ;
void QueuePush(QueueHead * Q, QueueElemType data) ;
void QueuePop(QueueHead * Q, QueueElemType & data) ;
int QueueEmpty(QueueHead * Q) ;

//TreeTraverse的有关声明
TreeNode * InitTree(TreeNode * T) ;
void PreTraverseTree1(TreeNode * T) ;
void PreTraverseTree2(TreeNode * T) ;
void InOrderTraverseTree1(TreeNode * T) ;
void InOrderTraverseTree2(TreeNode * T) ;
void LastTraverseTree1(TreeNode * T) ;
void LastTraverseTree2(TreeNode * T) ;
void LevelTraverseTree(TreeNode * T) ;

//栈的函数定义
StackNode * InitStack(StackNode * S)
{
    S = (StackNode *)malloc(sizeof(StackNode)) ;
    if(NULL == S)
    {
        printf("内存不足,不能分配栈!\n") ;
        exit(0) ;
    }

    S->next = NULL ;
    return(S) ;
}

void StackPush(StackNode * S, StackElemType data)
{
    StackNode * q ;
    q = (StackNode *)malloc(sizeof(StackNode)) ;
    if(NULL == q)
    {
        printf("内存不足,不能分配栈!\n") ;
        exit(0) ;
    }
    q->data = data ;
    q->next = S->next ;
    S->next = q ;
}

void StackPop(StackNode * S, StackElemType & data)
{
    StackNode * q ;
    if(NULL == S->next)
    {
        printf("栈为空,无返回值!\n") ;
    }

    q = S->next ;
    data = q->data ;
    S->next = q->next ;
    free(q) ;
}

int StackEmpty(StackNode * S)
{
    if(NULL == S->next)
    {
        return(1) ;
    }

    return(0) ;
}

int StackGetTop(StackNode * S, StackElemType & data)
{
    if(NULL != S->next)
    {
        data = S->next->data ;
        return(1) ;
    }
    else
    {
        //data = NULL ;
        return(0) ;
    }
}


//队列函数的定义
QueueHead * InitQueue(QueueHead * Q)
{
    QueueNode * q ;
    Q = (QueueHead *)malloc(sizeof(QueueHead)) ;
    if(NULL == Q)
    {
        printf("内存不足!\n") ;
        exit(0) ;
    }
    q = (QueueNode *)malloc(sizeof(QueueNode)) ;
    if(NULL == q)
    {
        printf("内存不足!\n") ;
        exit(0) ;
    }

    q->next = NULL ;
    Q->front = q ;
    Q->rear = q ;

    return(Q) ;
}

void QueuePush(QueueHead * Q, QueueElemType data)
{
    QueueNode * q ;
    q = (QueueNode *)malloc(sizeof(QueueNode)) ;
    if(NULL == q)
    {
        printf("内存不足!\n") ;
        exit(0) ;
    }

    q->data = data ;
    q->next = Q->rear->next ;
    Q->rear->next = q ;
    Q->rear = q ;
}

void QueuePop(QueueHead * Q, QueueElemType & data)
{
    QueueNode * q ;
    if(Q->front == Q->rear)
    {
        printf("队列为空!\n") ;
        return ;
    }

    q = Q->front->next ;
    data = q->data ;
    Q->front->next = q->next ;
    if(Q->rear == q)
        Q->rear = Q->front ;

    free(q) ;
}

int QueueEmpty(QueueHead * Q)
{
    if(Q->front == Q->rear)
        return(1) ;
    else
        return(0) ;
}


//树的各种遍历函数定义

/*建立一棵二叉树*/
TreeNode * InitTree(TreeNode * T)
{
    char data ;
    scanf("%c", &data) ;

    if(# == data)
    {
        T = NULL ;
    }
    else
    {
        T = (TreeNode *)malloc(sizeof(TreeNode)) ;
        T->data = data ;
        T->leftchild = InitTree(T->leftchild) ;
        T->rightchild = InitTree(T->rightchild) ;
    }

    return(T) ;
}

/*二叉树递归先序遍历*/
void PreTraverseTree1(TreeNode * T)
{
    if(T)
    {
        printf("%c  ", T->data) ;
        PreTraverseTree1(T->leftchild) ;
        PreTraverseTree1(T->rightchild) ;
    }
}

/*二叉树的非递归先序遍历*/
void PreTraverseTree2(TreeNode * T)
{
    StackNode * S ;
    TreeNode * p ;
    S = NULL ;
    p = T ;
    S = InitStack(S) ;

    if(NULL == p)
    {
        printf("树为空!\n") ;
        return ;
    }

    while(p || !StackEmpty(S))
    {
        if(p)
        {
            StackPush(S, p) ;
            printf("%c  ", p->data) ;
            p = p->leftchild ;
        }
        else
        {
            StackPop(S, p) ;
            p = p->rightchild ;
        }
    }

    free(S) ;
}

/*二叉树递归中序遍历*/
void InOrderTraverseTree1(TreeNode * T)
{
    if(T)
    {
        InOrderTraverseTree1(T->leftchild) ;
        printf("%c  ", T->data) ;
        InOrderTraverseTree1(T->rightchild) ;
    }
}

/*二叉树的非递归中序遍历*/
void InOrderTraverseTree2(TreeNode * T)
{
    StackNode * S ;
    TreeNode * p ;
    S = NULL ;
    p = T ;
    S = InitStack(S) ;

    if(NULL == p)
    {
        printf("树为空!\n") ;
        return ;
    }

    while(p || !StackEmpty(S))
    {
        if(p)
        {
            StackPush(S, p) ;
            p = p->leftchild ;
        }
        else
        {
            StackPop(S, p) ;
            printf("%c  ", p->data) ;
            p = p->rightchild ;
        }
    }
    free(S) ;
}

/*二叉树递归后序遍历*/
void LastTraverseTree1(TreeNode * T)
{
    if(T)
    {
        LastTraverseTree1(T->leftchild) ;
        LastTraverseTree1(T->rightchild) ;
        printf("%c  ", T->data) ;
    }
}

/*二叉树非递归后序遍历*/
void LastTraverseTree2(TreeNode * T)
{
    StackNode * S ;
    TreeNode * cur, * pre ;
    S = NULL ;
    S = InitStack(S) ;
    if(NULL == T)
    {
        printf("树为空!\n") ;
        return ;
    }

    pre = NULL ;    cur = NULL ;
    StackPush(S,T) ;
    while(!StackEmpty(S))
    {
        cur = NULL ;
        StackGetTop(S,cur) ;
        if((cur->leftchild == NULL && cur->rightchild == NULL) || (pre != NULL && (pre == cur->leftchild ||pre == cur->rightchild)))
        {
            printf("%c  ", cur->data) ;
            pre = cur ;
            StackPop(S,cur) ;
        }
        else
        {
            if(cur->rightchild != NULL)
            {
                StackPush(S,cur->rightchild) ;
            }
            if(cur->leftchild != NULL)
            {
                StackPush(S,cur->leftchild) ;
            }
        }
    }
    free(S) ;
}

/*二叉树层次遍历*/
void LevelTraverseTree(TreeNode * T)
{
    QueueHead * Q ;
    TreeNode * p ;
    Q = NULL ;    p = T ;
    Q = InitQueue(Q) ;
    if(NULL == p)
    {
        printf("树为空!\n") ;
        return ;
    }

    QueuePush(Q,p) ;
    while(!QueueEmpty(Q))
    {
        p = NULL ;
        QueuePop(Q,p) ;

        if(NULL != p->leftchild)
            QueuePush(Q,p->leftchild) ;

        if(NULL != p->rightchild)
            QueuePush(Q,p->rightchild) ;

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


//主函数的定义
void Tips()
{
    printf("建立树是按照先序遍历来建立树的,并且输入‘#’表示子树为空。\n") ;
    printf("请输入要建立的树:") ;
}

int main()
{
    TreeNode * T ;
    T = NULL ;

    Tips() ;

    T = InitTree(T) ;

    printf("二叉树递归先序遍历\n") ;
    PreTraverseTree1(T) ;
    printf("\n") ;

    printf("二叉树非递归先序遍历\n") ;
    PreTraverseTree2(T) ;
    printf("\n") ;

    printf("二叉树递归中序遍历\n") ;
    InOrderTraverseTree1(T) ;
    printf("\n") ;

    printf("二叉树非递归中序遍历\n") ;
    InOrderTraverseTree2(T) ;
    printf("\n") ;

    printf("二叉树递归后序遍历\n") ;
    LastTraverseTree1(T) ;
    printf("\n") ;

    printf("二叉树非递归后序遍历\n") ;
    LastTraverseTree2(T) ;
    printf("\n") ;

    printf("二叉树层次遍历\n") ;
    LevelTraverseTree(T) ;
    printf("\n") ;

    return 0 ;
}


参考自:https://www.cnblogs.com/fengxmx/p/3764512.html

二叉树先序中序后序的递归及非递归遍历

标签:treenode   last   set   返回   struct   init   style   ini   节点   

原文地址:http://www.cnblogs.com/xisheng/p/8094289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!