| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 609 人关注过本帖
标题:关于二叉树及一些问题求解
只看楼主 加入收藏
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:6 
关于二叉树及一些问题求解
本来觉得递归二叉树挺简单的,但是实际动手下来发现,有些不理解的错。附上代码。
#include "stdio.h"
#include "malloc.h"
typedef struct BiNode
{
    char data;
    struct BiNode *lchild,*rchild;
}BiNode,*bi_tree;

void create_tree(bi_tree &T)
{
    char data;
    //printf("请按先序遍历输入结点的值 :\n");
    scanf("%c",&data);
    if(data==' ')
        T=NULL;
    else
    {
        T=(bi_tree)malloc(sizeof(bi_tree));
        if(T)
        {
            T->data=data;
            create_tree(T->lchild);
            create_tree(T->rchild);            
        }
    }
}
void visit(bi_tree T)
{
        printf("%c",T->data);
}
void pre_order(bi_tree T)   //前序

NULL)
        visit(T);
    pre_order(T->lchild); //断点
    pre_order(T->rchild);
}
void in_order(bi_tree T)  //中序遍历

   if(T!=NULL)
        in_order(T->lchild);
    visit(T);
    in_order(T->rchild);
}
void post_order(bi_tree T)
{
    if(T!=NULL)
        post_order(T->lchild);
    post_order(T->rchild);
    visit(T);
}
void main()
{
    bi_tree T;
    create_tree(T);
    pre_order(T);
    in_order(T);
    post_order(T);
}
有以下几个问题不懂。
第一就是,建立二叉树时,输入ABD  SD  D   ,这些空格怎么回事?就是读取时,明明是一个一个字符读取,怎么一下就可以把它按前序遍历输入完?  
第二就是,二级指针有些不懂,例如void create_tree(bi_tree &T)、void create_tree(bi_tree T)、void create_tree(bi_tree *T),还有构造结构体时的*bi_tree,怎么会用这个指针定义T?
第三就是,T=(bi_tree)malloc(sizeof(bi_tree)),和T=(bi_tree *)malloc(sizeof(bi_tree));,这个*号,有什么区别么?还有就是这个程序错在哪里了。
问题很多,抱歉。
搜索更多相关主题的帖子: include 二叉树 
2014-12-10 15:01
comewest
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:74
专家分:335
注 册:2014-12-3
收藏
得分:21 
第一就是,你还可以再看看递归的知识,再看二叉树的遍历;第二就是,看看typedef的作用;第三就是这个程序先序遍历和中序遍历少了一部分语句,估计是你打字的时候漏掉了?
2014-12-10 16:09
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
,递归就是再次引用creat_tree这个函数,那么再次引用也会用scanf输入吧?%c是读取一个字符,但是输入的是字符串,感觉不懂。还有就是typedef定义的是一个别名,将结点BiNode取别名为BiNode,我问的是二级指针的问题。最后,前中后的遍历除了函数调用顺序和函数名不一样,其他都一样,前序打掉了。
2014-12-10 20:13
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
没人么?
2014-12-11 18:36
comewest
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:74
专家分:335
注 册:2014-12-3
收藏
得分:0 
个人理解:
第一,输入的字符序列是放在内存的缓冲区中的,调用一次scanf就把缓冲区中离出口最近的一个字符输出,输出后,就把它释放掉,同样的方法把字符序列中的字符一个个的在内存中释放掉。。。
第二,“构造结构体时的*bi_tree,用这个指针定义T”和  “构造结构体时用bi_tree再用bi_tree定义*T;” 是一样的效果;可以理解T为指向链式存储的二叉树根节点的指针。  &T就是该指针的地址,即你说的二级指针。为什么create_tree函数的形式参数用&T,因为构造之后的新二叉树就是T,指针作为函数参数直接操纵地址中的内容就可以实现构造T,而不用在create_tree函数内部再定义一个指针指向二叉树的根节点再用return将指针返回。

[ 本帖最后由 comewest 于 2014-12-31 11:01 编辑 ]
2014-12-11 19:53
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
似懂非懂,那么程序哪里出问题了?
2014-12-12 20:05
传哥
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-5-10
收藏
得分:0 
回复 楼主 梦里云归
你这个程序很多问题啊,首先有些地方程序不完整。
你的第一个问题呢,你可以有ch=getchar()函数
还有,在你的主函数中,你的每个函数都没有返回值,T的值没有改变,而你又在后续的函数让T做实参。
我是大一的,还有什么问题可以联系的我Q,大家一起进步。
2015-05-10 23:05
快速回复:关于二叉树及一些问题求解
数据加载中...
 
   



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

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