| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1006 人关注过本帖
标题:帮帮忙,非递归算法先序建立二叉链表,问题出在哪里呢?
只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:6 
帮帮忙,非递归算法先序建立二叉链表,问题出在哪里呢?
#define STACK_INIT_SIZE 100//测试值:abc@@de@g@@f@@@
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;

//////////////////////////////////////////////栈定义
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
/////////////////////////////////////////////栈的基本操作
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTree *e)//////////////////
{
    if(s->top==s->base) exit(0);
    *e=*--(s->top);//
}
int GetTop(SqStack *s,BiTree *e)///////////////////
{
    if(s->top==s->base) return(0);
    *e=*(s->top-1);//
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
void ClearStack(SqStack *s)
{
    s->top=s->base;
    s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
    free(s->base);
    s->stacksize=0;
}
BiTree CreatBiTree()//非递归算法先序建立二叉链表
{
    TElemType ch;
    BiTree T,p;
    SqStack S;
    initialStack(&S);
    scanf("%c",&ch);
    if(ch==' ')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        T->lchild=T->rchild=NULL;
        Push(&S,T);
    }
     while(!StackEmpty(&S))
     {
         scanf("%c",&ch);
         if(ch!=' ')//生成左儿子,直到左儿子为空时退出循环
         {
             p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->lchild=p;
             T=p;
             Push(&S,T);
             scanf("%c",&ch);
         }
         else
             Pop(&S,&T);//弹出最后一个左儿子(栈顶元素)
         T->lchild=NULL;
         scanf("%c",&ch);
         if(ch==' ')//右儿子为空的情况
         {
             while((ch==' ')&&(!StackEmpty(&S)))//弹出栈顶元素,逆向返回,直到右儿子不为空
             {
                 T->rchild=NULL;
                 Pop(&S,&T);//弹出根结点,进入右子树
                 scanf("%c",&ch);
             }
             p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->rchild=p;//右儿子的根结点p的父亲为T
             T=p;
             Push(&S,T);
         }
         else//右儿子不为空的情况
         {
             p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->rchild=p;//右儿子的根结点p的父亲为T
             T=p;
             Push(&S,T);
         }
     }
     return T;
}   
void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
void PreOrderTraverse(BiTree T)//先序遍历
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
/////////////////////////////////
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    printf("<参考数据:abc@@de@g@@f@@@,则用空格键表示@,输完后再输入一个回车键.>\n");
    t=CreatBiTree();
    printf("[先序遍历]:\n");
    PreOrderTraverse(t);
    printf("\n");
}
搜索更多相关主题的帖子: 链表 递归 算法 
2010-05-12 15:39
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
你建树逻辑有问题
pseudo-code as followed:
push root into stack;
while(!emptyStack)
{
    input ch;
    if(ch!=' '&& Right == false)
       {
           assign the node of tree;
           push this node into stack;
        }
    if (ch ==' ')
         {
            pop the stack;
            Right = true;// turn right;
         }
    if (ch!=' '&& Right == true)
         {
            assign the node of tree;
            push this node into stack;
            Right = false; // turn left;
          }
}
程序代码:
#define STACK_INIT_SIZE 100//测试值:abc@@de@g@@f@@@
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
//////////////////////////////////////////////栈定义
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
/////////////////////////////////////////////栈的基本操作
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTree *e)//////////////////
{
    if(s->top==s->base) exit(0);
    *e=*--(s->top);//
}
int GetTop(SqStack *s,BiTree *e)///////////////////
{
    if(s->top==s->base) return(0);
    *e=*(s->top-1);//
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
void ClearStack(SqStack *s)
{
    s->top=s->base;
    s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
    free(s->base);
    s->stacksize=0;
}
BiTree CreatBiTree()//非递归算法先序建立二叉链表
{

 bool Right = false; //flag
    TElemType ch;
    BiTree T,p,root;
    SqStack S;
    initialStack(&S);
    scanf("%c",&ch);
    if(ch==' ')
        root=T=NULL;
    else
    {
        root=T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        T->lchild=T->rchild=NULL;
        Push(&S,T);
    }
     while(!StackEmpty(&S))
     {
         scanf("%c",&ch);
         if(ch!=' '&& Right == false)//生成左儿子
         {
             p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->lchild=p;
             T=p;
             Push(&S,T);
         }
         if (ch ==' ')
         {
   Pop(&S,&T);
   Right = true;
   }
   if (ch!=' '&& Right == true)
   {
    p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->rchild=p;
             T=p;
             Push(&S,T);
    Right = false;
   }
     }
     return root;
}  

void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
void PreOrderTraverse(BiTree T)//先序遍历
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
/////////////////////////////////
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    printf("<参考数据:abc@@de@g@@f@@@,则用空格键表示@,输完后再输入一个回车键.>\n");
    t=CreatBiTree();
    printf("[先序遍历]:\n");
    PreOrderTraverse(t);
    printf("\n");
} 



[ 本帖最后由 hzh512 于 2010-5-12 19:01 编辑 ]

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-12 18:59
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
这个还是有问题,比如说根结点的左儿子为空时就不对,如输入1@2@@时就只能输出1...
2010-05-12 22:01
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
这下可以了,修改了循环控制条件和scanf("%c",&ch);的位置可以避免上面的问题。谢谢了!



#define STACK_INIT_SIZE 100//测试值:abc@@de@g@@f@@@
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
//////////////////////////////////////////////栈定义
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
/////////////////////////////////////////////栈的基本操作
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTree *e)//////////////////
{
    if(s->top==s->base) exit(0);
    *e=*--(s->top);//
}
int GetTop(SqStack *s,BiTree *e)///////////////////
{
    if(s->top==s->base) return(0);
    *e=*(s->top-1);//
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
void ClearStack(SqStack *s)
{
    s->top=s->base;
    s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
    free(s->base);
    s->stacksize=0;
}
BiTree CreatBiTree()//非递归算法先序建立二叉链表
{
bool Right = false; //flag
    TElemType ch;
    BiTree T,p,root;
    SqStack S;
    initialStack(&S);
    scanf("%c",&ch);
    if(ch==' ')
        root=T=NULL;
    else
    {
        root=T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        T->lchild=T->rchild=NULL;
        Push(&S,T);
    }
    scanf("%c",&ch);//
     while(!StackEmpty(&S)||ch!=' ')////特殊情况:AB@@C@@,读到AB@@后栈空,但下一个字符不为空,程序任然继续执行
     {
         
         if(ch!=' '&& Right == false)//生成左儿子
         {
             p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->lchild=p;
             T=p;
             Push(&S,T);
         }
         if (ch ==' ')
         {
   Pop(&S,&T);
   Right = true;
   }
   if (ch!=' '&& Right == true)
   {
    p=(BiTree)malloc(sizeof(BiTNode));
             p->data=ch;
             p->lchild=p->rchild=NULL;
             T->rchild=p;
             T=p;
             Push(&S,T);
    Right = false;
   }
   scanf("%c",&ch);
     }
     return root;
}  

void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
void PreOrderTraverse(BiTree T)//先序遍历
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
/////////////////////////////////
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    printf("<参考数据:abc@@de@g@@f@@@,则用空格键表示@,输完后再输入一个回车键.>\n");
    t=CreatBiTree();
    printf("[先序遍历]:\n");
    PreOrderTraverse(t);
    printf("\n");
}
2010-05-13 09:11
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
嗯, 对你的积极思考持肯定态度,继续努力!!


[ 本帖最后由 hzh512 于 2010-5-13 11:27 编辑 ]

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-13 09:43
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:40 
给你个 程序结构优化了的。
楼主进步很大呀
程序代码:
BiTree CreatBiTree()//非递归算法先序建立二叉链表
{

 bool Right = false; //flag
    TElemType ch;
    BiTree T,p,root;
    SqStack S;
    initialStack(&S);
    scanf("%c",&ch);
    if(ch==' ')
        root=T=NULL;
    else
    {
        root=T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        T->lchild=T->rchild=NULL;
        Push(&S,T);
    }

 while(!StackEmpty(&S))

 {
  scanf("%c",&ch);
  if (Right == false)
  {
   if (ch == ' ')
   {
    Right = true;
   }
   else
   {
    p=(BiTree)malloc(sizeof(BiTNode));
    p->data=ch;
    p->lchild=p->rchild=NULL;
    T->lchild=p;
    T=p;
    Push(&S,T);
   }
  }
  else
  { // Right == true
   if (ch == ' ')
   {
    if (T !=root)
    {
     Pop(&S,&T);
     Pop(&S,&T);
     while (T->rchild != NULL && T != root)
     {
      Pop(&S,&T);
     }
     if (T->rchild == NULL)
      Push(&S,T);
    }
    else
    {
     return root;
    }
  
   }
   else
   {
    p=(BiTree)malloc(sizeof(BiTNode));
    p->data=ch;
    p->lchild=p->rchild=NULL;
    T->rchild=p;
    T=p;
    Push(&S,T);
    Right = false;
   }
  }


 }

 return root;
}


编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-13 11:13
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct BiTNode)
#define STACK_INIT_SIZE 100//测试值:abc@@de@g@@f@@@
#define STACKINCREMENT  10

typedef char TElemType;

//////////////////////////////////////////////栈定义
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}*BiTree;

typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
/////////////////////////////////////////////栈的基本操作
void initialStack(SqStack &s)
{
    s.base=(BiTree *)malloc(STACK_INIT_SIZE*LEN);
    if(!s.base)
        exit(0);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack &s, BiTree e)
{
    if(s.top-s.base >= s.stacksize)
    {
        s.base=(BiTree *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*LEN);
        if(!s.base)
            exit(0);
        s.top = s.base+s.stacksize;
        s.stacksize+=STACKINCREMENT;
    }
    *s.top++ = e;
}
void Pop(SqStack &s,BiTree &e)//////////////////
{
    if(s.top==s.base)
        exit(0);
    e = *--s.top;//
}
int GetTop(SqStack s,BiTree &e)///////////////////
{
    if(s.top==s.base)
        return(0);
    e=*(s.top-1);//
    return(1);
}
int StackEmpty(SqStack s)
{
    if(s.base==s.top)
        return(1);
    else
        return(0);
}
void ClearStack(SqStack &s)
{
    s.top = s.base;
    s.stacksize = 0;
}
void DestoryStack(SqStack &s)
{
    free(s.base);
    s.stacksize=0;
}
BiTree CreatBiTree()//非递归算法先序建立二叉链表
{
    TElemType ch[5];
    BiTree r,T,p;
    SqStack S;
    initialStack(S);
    scanf("%s",ch);
    if(ch[0]=='@')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch[0];
        T->lchild=T->rchild=NULL;
        Push(S,T);
    }
    r=T;
    while(!StackEmpty(S))
     {
        while( GetTop(S,r)&&r )
        {
            scanf("%s",ch);
            if(ch[0]=='@')
            {
                r->lchild = NULL;
                Push(S, r->lchild);
            }
            else
            {
             p = (BiTree)malloc(sizeof(BiTNode));
             p->data = ch[0];
             p->lchild = p->rchild = NULL;
             r->lchild = p;
             r=p;   
            Push(S, r);
            }         
       }
       Pop(S,r);
       if( !StackEmpty(S) )
       {
           Pop(S,r);
            scanf("%s",ch);
            if(ch[0]=='@')
            {
                r->rchild = NULL;
                Push(S, r->rchild);
            }
            else
            {
             p = (BiTree)malloc(sizeof(BiTNode));
             p->data = ch[0];
             p->lchild = p->rchild = NULL;
             r->rchild = p;
             r = p;
            Push(S,r);
            }
       }
     }
     return T;
}   
void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
void PreOrderTraverse(BiTree T)//先序遍历
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
/////////////////////////////////
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    printf("<参考数据:abc@@de@g@@f@@@,输完后再输入一个回车键.>\n");
    t=CreatBiTree();
    printf("[先序遍历]:\n");
    PreOrderTraverse(t);
    printf("\n");
}
2010-05-13 18:54
快速回复:帮帮忙,非递归算法先序建立二叉链表,问题出在哪里呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098901 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved