Celia_D 2019-11-26 16:12 采纳率: 50%
浏览 588
已采纳

二叉树非递归前序遍历

实在看不出来有啥毛病了,请各位大佬帮忙看一下!

图片说明

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
#define N 100
extern char *a;     /*存放扩充二叉树的前序序列*/
char *a="ABC##D#E##F##";  /*扩充二叉树序树t的前序序列*/

typedef struct node /*二叉树结构定义*/
{
    char data;
    struct node *lchild,*rchild;
}binnode;
typedef binnode *bintree;

/*函数creatbintree (根据扩充二叉树的前序序列(字符串a)建立二叉树t的存储结构*/
bintree creatbintree()
{

    char ch=*a++;
    bintree t;
    if  (ch=='#')  
        t=NULL;
    else
    { t=(bintree)malloc(sizeof(binnode));
      t->data=ch;
      t->lchild=creatbintree();
      t->rchild=creatbintree();
    }
    return t;
}

void preorder(bintree t)  /*前序递归遍历二叉树*/
{
    if (t)
    {
        printf("%c",t->data);
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
void postorder(bintree t)  /*后序递归遍历二叉树*/
{
    if (t)
    {

        postorder(t->lchild);
        postorder(t->rchild);
        printf("%c",t->data);
    }
}

/*顺序栈定义*/
typedef struct
{
    bintree data[N];
    int top;
    int tag[N];
}seqstack;

void init(seqstack *s)   /*初始化空栈*/
{
    s->top=-1;
}
int empty(seqstack *s)   /*判断栈是否为空*/
{
    if (s->top>-1) return 0;
    else return 1;
}
int full(seqstack *s)   /*判断栈是否为满*/
{
    if (s->top==N-1) return 1;
    else return 0;
}
void push(seqstack *s ,bintree x)   /*进栈*/
{
    if (!full(s))
        s->data[++s->top]=x;
}
bintree pop(seqstack *s)            /*出栈*/
{
    if (!empty(s))
        return s->data[s->top--];
}

bintree top(seqstack *s)
{
    if(empty(s))
        return s->data[s->top];
}

/*函数preorder1()的功能是非递归前序遍历二叉树t*/
void preorder1(bintree t)
{
    seqstack *s;
    init(s);
    bintree p=t;
    while(!empty(s)||p)
    {
        if(p)
        {
            cout<<p->data;
            push(s,p);
            p=p->lchild;
        }
        else
        {
            p=top(s);
            pop(s);
            p=p->rchild;
        }
    }
    cout<<endl;

}
int _tmain(int argc, _TCHAR* argv[])
{

    bintree t;
    t=creatbintree();   /*建立二叉树t的存储结构*/
    printf("二叉树的前序序列为:\n");
    preorder1(t);       /*前序非递归遍历二叉树*/
    return 0;
}

  • 写回答

4条回答 默认 最新

  • 空白如空 2019-11-26 17:20
    关注
    
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    #define N 100
    extern char *a;     /*存放扩充二叉树的前序序列*/
    char *a="ABC##D#E##F##";  /*扩充二叉树序树t的前序序列*/
    
    typedef struct node /*二叉树结构定义*/
    {
        char data;
        struct node *lchild,*rchild;
    }binnode;
    typedef binnode *bintree;
    
    /*函数creatbintree (根据扩充二叉树的前序序列(字符串a)建立二叉树t的存储结构*/
    bintree creatbintree()
    {
    
        char ch=*a++;
        bintree t;
        if  (ch=='#')  
            t=NULL;
        else
        { t=(bintree)malloc(sizeof(binnode));
          t->data=ch;
          t->lchild=creatbintree();
          t->rchild=creatbintree();
        }
        return t;
    }
    
    void preorder(bintree t)  /*前序递归遍历二叉树*/
    {
        if (t)
        {
            printf("%c",t->data);
            preorder(t->lchild);
            preorder(t->rchild);
        }
    }
    void postorder(bintree t)  /*后序递归遍历二叉树*/
    {
        if (t)
        {
    
            postorder(t->lchild);
            postorder(t->rchild);
            printf("%c",t->data);
        }
    }
    
    /*顺序栈定义*/
    typedef struct
    {
        bintree data[N];
        int top;
        int tag[N];
    }seqstack;
    
    void init(seqstack *s)   /*初始化空栈*/
    {
        s->top=-1;
    }
    int empty(seqstack *s)   /*判断栈是否为空*/
    {
        if (s->top>-1) return 0;
        else return 1;
    }
    int full(seqstack *s)   /*判断栈是否为满*/
    {
        if (s->top==N-1) return 1;
        else return 0;
    }
    void push(seqstack *s ,bintree x)   /*进栈*/
    {
        if (!full(s))
            s->data[++s->top]=x;
    }
    bintree pop(seqstack *s)            /*出栈*/
    {
        if (!empty(s))
            return s->data[s->top--];
    }
    
    bintree top(seqstack *s)
    {
        if(!empty(s))  //修改位置
            return s->data[s->top];
    }
    
    /*函数preorder1()的功能是非递归前序遍历二叉树t*/
    void preorder1(bintree t)
    {
        seqstack *s = new seqstack(); //修改位置
        init(s);
        bintree p=t;
        while(!empty(s)||p)
        {
            if(p)
            {
                cout<<p->data;
                push(s,p);
                p=p->lchild;
            }
            else
            {
                p=top(s);
                pop(s);
                p=p->rchild;
            }
        }
        cout<<endl;
    
    }
    int main()
    {
    
        bintree t;
        t=creatbintree();   /*建立二叉树t的存储结构*/
        printf("二叉树的前序序列为:\n");
        preorder1(t);       /*前序非递归遍历二叉树*/
    //    return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
  • ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
  • ¥15 MATLAB和mosek的求解问题
  • ¥20 修改中兴光猫sn的时候提示失败
  • ¥15 java大作业爬取网页
  • ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
  • ¥15 有没有办法利用libusb读取usb设备数据