先序創建二叉樹,非遞歸中序遍歷輸出


#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