| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4309 人关注过本帖
标题:如何生成一个二叉树,求解决
只看楼主 加入收藏
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
结帖率:81.82%
收藏
已结贴  问题点数:40 回复次数:11 
如何生成一个二叉树,求解决
程序代码:
别的函数没有错,creat_tree这个函数错了,不知道怎么用递归的形式生成一个二叉树,这个函数为错在哪里?

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 30
typedef struct tree
{
    int date;
    struct tree *lchild;
    struct tree *rchild;
}tree,*T;//定义树的数据结构;
typedef struct stack
{
    tree **base;
    int top;
    int size;
    int incresize;
}stack,*S;//定义一个栈;
void init_stack(S s)
{
    s->size=N;
    s->base=(tree**)malloc(s->size*sizeof(tree*));
    s->top=0;
}//初始化一个栈
void push_stack(S s,T e)
{
    tree **newbase;
    if(s->top==s->size-1)
    {
        newbase=(T*)realloc(s->base,(s->incresize+s->size)*sizeof(tree*));
        if(newbase==NULL)  printf("没能申请到空间\n");
        else 

        {
            s->base=newbase;
            s->top=s->size-1;
            s->size=s->size+s->incresize;
        }
    }
    else s->base[s->top++]=e;
}//进栈
T pop_stack(S s)
{
    T e;
    if(s->top==0)
    {
        printf("   the stack is empty\n");
        return 0;
    }
    else 

        e=s->base[--s->top];
    return e;
}//出栈
int empty_stack(S s)
{
    if(s->top==0) return 1;
    else return 0;
} //判断栈是否为空
void pre_traverse_d(T t)
{
    int e;
    if(t!=NULL)
    {
        e=t->date;
        printf("   %d   ",e);
        pre_traverse_d(t->lchild);
        pre_traverse_d(t->rchild);
    }

}//先序遍历的递归形式
void pre_traverse_s1(T t,S s)
{
    int e; T p;
    p=t;
    init_stack(s);
    while(p||!empty_stack(s))
    {
        if(p)
        {
            e=p->date;
            printf("   %d   ",e);
            push_stack(s,p);
            p=p->lchild;
        }
        else
        {
            p=pop_stack(s); p=p->rchild;
        }
    }
    return ;
}//先序遍历的堆栈形式
void pre_traverse_s2(T t,S s)
{
    T p;
    p=t;
    init_stack(s);
    while(p||!empty_stack(s))
    {
        if(p)
        {
            push_stack(s,t);
            p=p->lchild;
        }
        else
        {
            p=pop_stack(s);
            printf("   %d   ",p->date);
            p=p->rchild;
        }
    }
}//中序遍历的堆栈形式
void creat_tree(T t)
{
    int e;char c;
    printf("输入二叉树节点控制量\n");
    scanf("%c",&c);
    if(c=='\0') t=NULL;
    else
    {
        printf("输入二叉树节点数据\n");
        scanf("%d",&e);
        t->date=e;
        t->lchild=(T)malloc(sizeof(tree));
        creat_tree(t->lchild);
        t->rchild=(T)malloc(sizeof(tree));
        creat_tree(t->rchild);
    }
}
void main()
{
    tree t;stack s;
    creat_tree(&t);
    pre_traverse_s2(&t,&s);

}
搜索更多相关主题的帖子: 二叉树 如何 
2014-10-23 21:39
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
这是修改后程序   ,一运行起来
还是不行
运行出现第二次scanf少了没有执行
T creat_tree()
{
    int e;char c;T t;
    printf("输入二叉树节点控制量\n");
    scanf("%c",&c);
    if(c=='\0') t=NULL;
    else
    {
   
        t=(T)malloc(sizeof(tree));
        printf("输入二叉树节点数据\n");
        scanf("%d",&e);
        t->date=e;
        t->lchild=creat_tree();
        t->rchild=creat_tree();
    }
    return t;
}
void main()
{
    T t;stack s;
    t=creat_tree();
    pre_traverse_s2(t,&s);

}
2014-10-23 22:44
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 2 楼 风车转风车 89
为什么在执行递归的第一层是scanf("%c",&c)不起作用;
这句话要是不起作用的话就不能控制其生成左子树还是生成右子树;
2014-10-23 23:03
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 3 楼 风车转风车 89
要沉了嘛?
2014-10-24 18:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
使用scanf要注意处理回车

另外1楼的代码有错误,2楼就没问题了,多想想。



[fly]存在即是合理[/fly]
2014-10-24 21:22
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 5 楼 azzbcc
第一次输入时正确第二次输入时 就是递归的第二层
图片附件: 游客没有浏览图片的权限,请 登录注册
前一个scanf就不起作用了,如图不知道该怎么解决,我跟踪了一下那条语句直接就跳过了
2014-10-24 22:28
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 5 楼 azzbcc
版主,我用c++输入cin没有出错,但是用scanf,getchar,都出错 ,为什么呢,难道scanf和getchar没有C++稳定
2014-10-25 12:51
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:20 
好问题,自己学到了不少,我写个个构造二叉树的函数,你参考
程序代码:
void creat_tree(T &t)
{
    int e;char c;
    printf("输入二叉树节点控制量\n");
    scanf("%c",&c);
    getchar();
    if(c=='O') t=NULL;     //如果没有结点,输入英文O
    else
    {
        printf("输入二叉树节点数据\n");
        scanf("%d",&e);
        getchar();
        t->date=e;
        t->lchild=(T)malloc(sizeof(tree));
        if(t->lchild==NULL)  printf("no space!");
        creat_tree(t->lchild);
        t->rchild=(T)malloc(sizeof(tree));
        creat_tree(t->rchild);     
    }
}
2014-10-25 13:41
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 8 楼 soulmate1023
看了您的对getchar解释 茅塞顿开呀,能加你为好友吗,我工科的 就学过c,数据结构自己看的;有不理解的地方只能自己死扣,感觉效率好低
2014-10-25 14:46
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 9 楼 风车转风车 89
可以呀,其实我也是工科,计算机的,但是也属于奋斗中,我们可以一起互相学习。
2014-10-25 14:49
快速回复:如何生成一个二叉树,求解决
数据加载中...
 
   



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

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