菜鸡自养过程 2022-11-13 11:08 采纳率: 0%
浏览 11

二叉树非递归后序遍历


#include<stdio.h>
#include<stdlib.h>
#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
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-13 14:04
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 11月13日

悬赏问题

  • ¥15 Matlab在app上输入带有矩阵形式的初始条件发生错误
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 用ADS设计一款的射频功率放大器