wei xin_44706101 2019-11-25 23:16 采纳率: 100%
浏览 332
已采纳

二叉树问题非递归中序遍历

typedef struct bnode
{char data;
struct bnode *lchild;
struct bnode *rchild;
int top;
}bnode;
 bnode stack[100];
void initstack(bnode * stack)
{
    stack->top=-1;}
void push(bnode*stack,bnode*p)
{ if(p)
 {stack->top++;
 stack[stack->top].data=p->data;
}}
void pop(bnode*stack)
{
    stack->top--;}
int stackempty(bnode*stack)
{ if (stack->top==-1)
    return 0;
return 1;
}
bnode * top(bnode*stack)
{ bnode* t=&stack[stack->top];

return t;}
void stackmidread(bnode*root)
{ bnode*p=root;

initstack(stack);
while(p || stackempty(stack)==1)
{    while(p)
{push(stack,p);
 p=p->lchild;
}
if (stackempty(stack)==1)
{ p=top(stack);
  printf("%c", p->data);
  pop(stack);
  p=p->rchild;
}}

跪求大佬解答 为什么中序遍历ABD###CE##FG###
只显示DBA
bnode * createtree()
{ char ch;
bnode*p;

  ch=getchar();
  if (ch=='#')
      p=NULL;
  else{ p=(bnode*)malloc(sizeof(bnode));
  p->data=ch;
  p->lchild=createtree();
  p->rchild=createtree();}
  return p;
}
```void main ()
{ bnode *root=createtree();

stackmidread(root);
}
  • 写回答

2条回答 默认 最新

  • ysuwood 2019-11-26 22:57
    关注

    push中少了一句:
    stack[stack->top].rchild=p->rchild;//增加
    详见下面代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct bnode
    {
        char data;
        struct bnode *lchild;
        struct bnode *rchild;
        int top;
    }bnode;
    
    bnode stack[100];
    
    void initstack(bnode * stack)
    {
        stack->top=-1;
    }
    
    void push(bnode*stack,bnode*p)
    { 
        if(p)
        {
            stack->top++;
            stack[stack->top].data=p->data;
            stack[stack->top].rchild=p->rchild;//增加
        }
    }
    
    void pop(bnode*stack)
    {
        stack->top--;
    }
    
    int stackempty(bnode*stack)
    {
        if (stack->top==-1)
            return 0;
        return 1;
    }
    
    bnode * top(bnode*stack)
    { 
        bnode* t=&stack[stack->top];
        return t;
    }
    
    void stackmidread(bnode*root)
    { 
        bnode*p=root;
    
        initstack(stack);
        while(p || stackempty(stack)==1)
        {   
            while(p)
            {
                push(stack,p);
                p=p->lchild;
            }
            if (stackempty(stack)==1)
            { 
                p=top(stack);
                printf("%c", p->data);
                pop(stack);
                p=p->rchild;
            }
        }
    }
    
    bnode * createtree()
    {
        char ch;
        bnode *p;
    
        ch=getchar();
        if (ch=='#')
            p=NULL;
        else
        {
            p=(bnode*)malloc(sizeof(bnode));
            p->data=ch;
            p->lchild=createtree();
            p->rchild=createtree();
        }
    
        return p;
    }
    
    void main()
    { 
        bnode *root=createtree();
        stackmidread(root);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 mysql sum函数优化
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹