aaasdfgzzy 2022-10-30 08:13 采纳率: 79.4%
浏览 21
已结题

c语言-数据结构-非递归打印二叉树

//非递归打印二叉树程序,非递归打印部分程序没有结果。


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct bitree
{
    int data;
    struct bitree *lchild,*rchild;
}*BiTree,BiNode;

typedef struct stack
{
    struct stack *next;
 BiTree adress;
}Stack;

typedef struct
{
 Stack *base,*top;
}LinkStack;

void InsertAdress(LinkStack *s,BiTree p) //将每个节点地址插入栈中
{
    Stack *r;
    r = (Stack*)malloc(sizeof(Stack));
    r->next = NULL;
    r->adress =  p;
    s->top = r;
}

BiNode *DeleteAddress(LinkStack *s,BiTree *p)//出栈,但不删除栈中元素
{
  Stack *q;
  q = s->base;
  while(q->next != s->top)
    q = q->next;
  s->top = q;
  p = s->top;
  return p;  //返回上一个节点的地址
}

int Creat(BiTree *Tree)//递归建立二叉树
{
    int elem;
    scanf("%d",&elem);
    if(elem == 0) *Tree = NULL;
    else
    {
        *Tree = (BiTree)malloc(sizeof(BiNode));
        (*Tree)->data = elem;
        Creat(&(*Tree)->lchild);
        Creat(&(*Tree)->rchild);
    }
    return 0;
}

void Print(BiTree Tr) //递归打印二叉树
{
    if(Tr)
    {
        printf("%d ",Tr->data);
        Print(Tr->lchild);
        Print(Tr->rchild);
    }
}
//非递归打印部分程序没有结果
void PreOrder(BiTree Tr) //非递归打印二叉树
{
 LinkStack s;
 s.base = s.top = NULL;
    BiTree p;
 p = (BiTree*)malloc(sizeof(BiNode));
    p = Tr;
    while(p != NULL || s.base != s.top)
    {
        while(p != NULL) // 当 p 不为空,找到他最左下节点。
        {
            printf("%d ",p->data);
   InsertAdress(&s,p);
   p = p->lchild;
        }
  
  if(s.base != s.top)
  {
   DeleteAddress(&s,&p); //递归返回找右结点。
   p = p->rchild;
  }
    }
}


int main()
{
    Stack S;
    BiTree Tr;
    printf("输入二叉树: ");
    Creat(&Tr);
    printf("\n递归打印: ");
    Print(Tr);
    printf("\n非递归打印为: ");
    PreOrder(Tr);
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-30 10:01
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月14日
  • 修改了问题 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?