先序创建二叉树,非递归中序遍历输出


#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXSIZE 100
typedef struct BiTNode
{
    char data;
    struct BiTNode *l;
    struct BiTNode *r;
} BiTNode,*BiTree;
typedef struct /*base为栈底指针,top为栈底指针,插入:top++; 删除:top--;*/
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;///栈的定义(顺序栈)
void InitStack(SqStack &S) ///初始化
{
    S.base=new BiTree[MAXSIZE];
    if(!S.base)
        printf("存储分配失败\n");
    S.top=S.base;
    S.stacksize=MAXSIZE;
}
int Push(SqStack &S,BiTree e)
{
    if(S.top-S.base==S.stacksize)
        return 0;
    *S.top++=e;
    return 1;
}
int Pop(SqStack &S,BiTree &e)
{
    if(S.top==S.base)
        return 0;
    e=*--S.top;
    return 1;
}
int StackEmpty(SqStack &S)
{
    if(S.top==S.base)//栈空
        return 1;
    else
        return 0;
}
void PreCreatBiTree(BiTree &T)///先序创建
{
    ///按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T;
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiTNode;
        T->data=ch;
        PreCreatBiTree(T->l);
        PreCreatBiTree(T->r);
    }
}
void MidOrderTraverse(BiTree &T)///中序遍历的非递归算法
{
    SqStack S;
    BiTree q,p;
    InitStack(S);///初始化一个空栈
    p=T;///指针p指向根结点
    q=new BiTNode;///申请一个结点空间q,用来存放栈顶弹出的元素
    while(p||!StackEmpty(S))///(当p非空or栈S非空)
    {
        if(p)
        {
            Push(S,p);
            p=p->l;
        }
        else
        {
            Pop(S,q);
            printf("%c",q->data);
            p=q->r;
        }
    }
}
int main()
{
    BiTree T;
    PreCreatBiTree(T);
    MidOrderTraverse(T);
    return 0;
}

先序创建二叉树,非递归中序遍历输出(利用栈,Push,Pop,StackEmpty)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM