小言_互联网的博客

C语言非递归遍历二叉树(破坏树结构的方式)

323人阅读  评论(0)

#include <stdio.h>
#include <stdlib.h>
typedef char treetype;     //二叉树节点数据类型

typedef struct BitNode     //二叉树结构体
{
    treetype data;
    struct BiNode *left;
    struct BitNode *right;
}BitNode,*BitTree;
typedef BitTree stacktype;     //栈节点数据类型

typedef struct node        //栈节点数据结构
{
    stacktype data;
    struct node *next;
}Node,*PNode;

typedef struct stack      //栈的结构
{
    Node *top;
    Node *base;
}Stack,*PStack;

void InitStack(PStack S)   //初始化栈,参数为一级指针,对该地址的内容进行操作,初始化的栈一定是top指针和base指向一个生成的空节点。
{
    PNode initnode=(PNode)malloc(sizeof(Node));
    S->base=initnode;
    S->top=initnode;
    initnode->next=NULL;
    printf("栈创建成功\n");
}

void push(PStack S,stacktype c)
{
    PNode newnode=(PNode)malloc(sizeof(Node));
    if(newnode==NULL)
    {
        return ;
    }
    else
    {
        S->top->data=c;
        newnode->next=S->top;
        S->top=newnode;

    }
}


void createBitTree(BitTree *T)
{
    treetype c;
    scanf("%c",&c);
    if(c=='#')
        return ;
    else
    {
        *T=(BitTree)malloc(sizeof(BitNode));
        (*T)->data=c;
        (*T)->left=NULL;
        (*T)->right=NULL;
        printf("节点创建成功\n");
        createBitTree(&((*T)->left));
        createBitTree(&((*T)->right));
    }
}

void first(BitTree T)    //先序递归遍历
{
        printf("%c\n",T->data);
        if(T->left!=NULL)
            first(T->left);
        if(T->right!=NULL)
            first(T->right);
}
int IsEmpty(PStack S)   //判断是否为空栈,是则返回1,不是则返回0
{
    if(S->base==S->top)
        return 1;
    else return 0;
}

stacktype pop(PStack S)
{
    if(S->base!=S->top)
    {
        PNode p=S->top;
        S->top=S->top->next;
        stacktype c=S->top->data;
        free(p);
        p=NULL;
        return (c);
    }
}

void firstNocircul(BitTree T)   //先序非递归,此方法没有破坏树结构
{
    Stack S;
    InitStack(&S);
    push(&S,T);
    while(IsEmpty(&S)!=1)
    {
        stacktype a=pop(&S);
        printf("%c",a->data);
        if(a->right!=NULL)
            push(&S,a->right);
        if(a->left!=NULL)
            push(&S,a->left);
    }
}

void midNocircle(BitTree T)    //中序非递归遍历,此方法破坏了树结构
{
    Stack S;
    InitStack(&S);
    push(&S,T);
    while(IsEmpty(&S)!=1)
    {
        stacktype a=pop(&S);
        if(a->left==NULL&&a->right==NULL)                                //五左右子树
        {
            printf("%c",a->data);
        }
        if(a->left!=NULL&&a->right!=NULL)  //有左右子树
        {
            push(&S,a->right);
            push(&S,a);
            push(&S,a->left);
            a->left=NULL;
            a->right=NULL;
        }
        if(a->left!=NULL&&a->right==NULL)  //有左子树,无右子树
        {
            push(&S,a);
            push(&S,a->left);
            a->left=NULL;
        }
        if(a->left==NULL&&a->right!=NULL)   //无左子树,有右子树
        {
            push(&S,a->right);
            push(&S,a);
            a->right=NULL;
        }
    }
}

void lastNocircle(BitTree T)         //后序非递归遍历二叉树,此方法破坏了树结构
{
    Stack S;
    InitStack(&S);
    push(&S,T);
    while(IsEmpty(&S)!=1)
    {
        stacktype a=pop(&S);
        if(a->left==NULL&&a->right==NULL)    //无左右子树,这个函数必须放在下面三个函数之前
        {
            printf("%c",a->data);Stack S;
    InitStack(&S);
        }
        if(a->left!=NULL&&a->right!=NULL)    //有左右子树
        {
            push(&S,a);
            push(&S,a->right);
            push(&S,a->left);
            a->left=NULL;
            a->right=NULL;
        }
        if(a->left!=NULL&&a->right==NULL)    //有左子树,无右子树
        {
            push(&S,a);
            push(&S,a->left);
            a->left=NULL;
        }
        if(a->left==NULL&&a->right!=NULL)    //无左子树,有右子树
        {
            push(&S,a);
            push(&S,a->right);
            a->right=NULL;
        }
    }
}
int main()
{
    BitTree T;
    createBitTree(&T);IsEmpty(&S)!=1
    printf("先序非递归遍历的结果是:");
    firstNocircul(T); printf("\n");
    printf("中序非递归遍历的结果是:");
    midNocircle(T);printf("\n");
    printf("后序非递归遍历的结果是:");
  //  lastNocircle(T);printf("\n");

}
 


转载:https://blog.csdn.net/qq_41148045/article/details/101028387
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场