二叉树非递归后序遍历


#include
#include
#define MaxSize 50

//定义二叉树的结构体
typedef struct BiTNode
{
    char data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

//定义栈的结构体
typedef struct SqStack
{
    BiTNode val[MaxSize];
    int top;
}SqStack;

SqStack S;

//初始化栈
void InitStack(SqStack& S)
{
    S.top = -1;
}

//判断栈是否为空
bool IsEmpty(SqStack& S)
{
    if (S.top == -1)
        return true;
    else
        return false;
}

//进栈
bool Push(SqStack& S, BiTNode& T)
{
    if (S.top == MaxSize - 1)
        return false;
    else
        S.val[++S.top] = T;
    return true;
}

void visit(BiTNode W) {
    printf("%c", W.data);
}

//出栈
BiTNode Pop(SqStack S)
{
    return S.val[S.top];
}

//非递归中序遍历
void PostOrder2(BiTree T)
{
    InitStack(S);    //初始化栈
    BiTNode* p = T;
    BiTNode* Y = NULL;
    BiTNode* q = T;
    while (p || !IsEmpty(S))   //S不空,p存在
    {
        if (p != NULL) {
            Push(S, *p);
            p = p->lchild;
        }
        else {
            *q = Pop(S); //返回栈顶元素
            if (q->rchild && (q->rchild) !=Y) { //这里Y的值一直指向栈顶元素,为什么?
                p = q->rchild;
            }

            else {
                visit(S.val[S.top--]);   //输出栈顶元素
                Y = q;
                p = NULL;
            }

        }
    }
}



//先序创建二叉树
void CreateBiTree(BiTree& T)
{
    char ch;
    ch = getchar();
    if (ch == '#')    //#代表空指针
        T = NULL;
    else
    {
        T = (BiTNode*)malloc(sizeof(BiTNode));
        if (T) {
            T->data = ch;
            CreateBiTree(T->lchild);
            CreateBiTree(T->rchild);
        }
    }
}

int main() {
    BiTree T;     //创建了一指针
    printf("创建先序构建的二叉树:\n");
    CreateBiTree(T);
    printf("\n后序遍历的结果为:");
    PostOrder2(T);
    return 0;
}

我的代码运行情况顺畅,但是在关键代码那里,Y值一直等于栈顶元素值,始终找不到原因。

img

我想要达到的结果:DEBCA