| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1024 人关注过本帖
标题:二叉树的创建和打印、。。。
只看楼主 加入收藏
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
结帖率:100%
收藏
 问题点数:0 回复次数:12 
二叉树的创建和打印、。。。
创建二叉树,要求是递归算法,输入形式为类似A(B(#,D),C(E,#)),#表示空子树。
打印:按树状打印
下面是我的算法,貌似创建部分有误,不能输出正确结果,求助、、、
#include <stdio.h>
#include <stdlib.h>

typedef struct BitNode
{
 char data;
 int  level;
 struct BitNode *lchild,*rchild;
}BitNode,*BiTree;

int CreateBiTree_GList( BiTree &T)//由广义表形式的输入建立二叉链表
{ char c;
 
  c=getchar();
  if(c=='#') T=NULL; //空子树
  else
  {
    T=(BitNode*)malloc(sizeof(BitNode));
    T->data=c;
    if(getchar()!='(') return 1;
    if(!CreateBiTree_GList(T->lchild)) return 1;
   
    if(getchar()!=',') return 1;
    if(!CreateBiTree_GList(T->rchild)) return 1;
   
    if(getchar()!=')') return 1; //这些语句是为了保证输入符合A(B,C)的格式
  }
  return 0;
}//CreateBiTree_GList

void Inorder(BiTree bt)
{
 int i;
 if(bt!=NULL)//按右根左遍历二叉树
 {
  Inorder(bt->rchild);
  printf("\t_________________\n\t");
  for(i=1;i<=4;i++)
      printf("| %c ",(i==bt->level)?bt->data:' ');
  printf("|\n");
  
  Inorder(bt->lchild);
 }
 
}

int main()
{
 
 int t;
 BiTree b;
 //建立二叉树
 b=(BiTree)malloc(sizeof(BitNode));
 t=CreateBiTree_GList(b);
 
 Inorder(b);//按右根左遍历二叉树
 printf("\t_________________\n\t");
 printf("\n");

 return 0;
}
   
搜索更多相关主题的帖子: 二叉树 
2011-04-17 20:19
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <malloc.h>

typedef struct BitNode
{
    struct BitNode *lchild, *rchild;
    int level;
    char data;
}BitNode, *BiTree;

char s[100];
char *c = s;

void get_str()
{
    int i=0;

    while( (s[i++] = getchar()) != '\n' );
}

int CreateBiTree_GList(BiTree &T)
{   
    if (*c=='#')
    {
        ++c;
        T = NULL;
    }
    else
    {
        T = (BitNode*) malloc (sizeof(BitNode));
        T->data = *c;
        T->lchild = T->rchild = NULL;
       
        c++;//补充一个符号
        if (*c =='(')
        {
            c++;
            if (CreateBiTree_GList(T->lchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ',')
        {
            c++;
            if (CreateBiTree_GList(T->rchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ')')
        {
            c++;
        }
    }

    return 0;
}

void Inorder(BiTree bt)
{
    if (NULL != bt)
    {
        Inorder(bt->lchild);
        printf("%c ",bt->data);
        Inorder(bt->rchild);
    }
}
/*
void Inorder(BiTree bt)
{
    int i;
   
    if (NULL != bt)
    {
        Inorder(bt->rchild);
        printf("\t_________________\n\t");

        for (i=1; i<=4; ++i)
        {
            printf("| %c ", (i==bt->level)? bt->data: ' ' );
        }
        printf("|\n");
       
        Inorder(bt->lchild);
    }
}
*/
int main(void)
{
    int t;
    BiTree b;
    //建立二叉树
    b=(BiTree)malloc(sizeof(BitNode));
    get_str();
    t=CreateBiTree_GList(b);

    Inorder(b);//按右根左遍历二叉树
    printf("\t_________________\n\t");
    printf("\n");


    return 0;
}
2011-04-18 09:16
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

输出的没有看  自己不会再来吧
2011-04-18 09:17
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 楼主 营养书
忘记说啦  
程序中有个很严重的错误  level的使用

printf("| %c ", (i==bt->level)? bt->data: ' ' );

在建立的时候并没有对其成员level赋值  所以level是不能使用的
2011-04-18 09:31
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
收藏
得分:0 
多谢指教。我再仔细研究一下。
2011-04-18 18:40
维海
Rank: 2
等 级:论坛游民
帖 子:23
专家分:53
注 册:2010-11-25
收藏
得分:0 
以下是引用寒风中的细雨在2011-4-18 09:16:16的发言:

#include <stdio.h>
#include <malloc.h>

typedef struct BitNode
{
    struct BitNode *lchild, *rchild;
    int level;
    char data;
}BitNode, *BiTree;

char s[100];
char *c = s;

void get_str()
{
    int i=0;

    while( (s = getchar()) != '\n' );
}

int CreateBiTree_GList(BiTree &T)
{   
    if (*c=='#')
    {
        ++c;
        T = NULL;
    }
    else
    {
        T = (BitNode*) malloc (sizeof(BitNode));
        T->data = *c;
        T->lchild = T->rchild = NULL;
      
        c++;//补充一个符号
        if (*c =='(')
        {
            c++;
            if (CreateBiTree_GList(T->lchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ',')
        {
            c++;
            if (CreateBiTree_GList(T->rchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ')')
        {
            c++;
        }
    }

    return 0;
}

void Inorder(BiTree bt)
{
    if (NULL != bt)
    {
        Inorder(bt->lchild);
        printf("%c ",bt->data);
        Inorder(bt->rchild);
    }
}
/*
void Inorder(BiTree bt)
{
    int i;
   
    if (NULL != bt)
    {
        Inorder(bt->rchild);
        printf("\t_________________\n\t");

        for (i=1; i<=4; ++i)
        {
            printf("| %c ", (i==bt->level)? bt->data: ' ' );
        }
        printf("|\n");
      
        Inorder(bt->lchild);
    }
}
*/
int main(void)
{
    int t;
    BiTree b;
    //建立二叉树
    b=(BiTree)malloc(sizeof(BitNode));
    get_str();
    t=CreateBiTree_GList(b);

    Inorder(b);//按右根左遍历二叉树
    printf("\t_________________\n\t");
    printf("\n");


    return 0;
}

此贴为本人应用他人,主要是留给自己以后看的
2011-04-20 22:45
维海
Rank: 2
等 级:论坛游民
帖 子:23
专家分:53
注 册:2010-11-25
收藏
得分:0 
以下是引用寒风中的细雨在2011-4-18 09:16:16的发言:

#include <stdio.h>
#include <malloc.h>

typedef struct BitNode
{
    struct BitNode *lchild, *rchild;
    int level;
    char data;
}BitNode, *BiTree;

char s[100];
char *c = s;

void get_str()
{
    int i=0;

    while( (s = getchar()) != '\n' );
}

int CreateBiTree_GList(BiTree &T)
{   
    if (*c=='#')
    {
        ++c;
        T = NULL;
    }
    else
    {
        T = (BitNode*) malloc (sizeof(BitNode));
        T->data = *c;
        T->lchild = T->rchild = NULL;
      
        c++;//补充一个符号
        if (*c =='(')
        {
            c++;
            if (CreateBiTree_GList(T->lchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ',')
        {
            c++;
            if (CreateBiTree_GList(T->rchild))
            {
                printf("\t输入有错误\n");
            }
        }
        if (*c == ')')
        {
            c++;
        }
    }

    return 0;
}

void Inorder(BiTree bt)
{
    if (NULL != bt)
    {
        Inorder(bt->lchild);
        printf("%c ",bt->data);
        Inorder(bt->rchild);
    }
}
/*
void Inorder(BiTree bt)
{
    int i;
   
    if (NULL != bt)
    {
        Inorder(bt->rchild);
        printf("\t_________________\n\t");

        for (i=1; i<=4; ++i)
        {
            printf("| %c ", (i==bt->level)? bt->data: ' ' );
        }
        printf("|\n");
      
        Inorder(bt->lchild);
    }
}
*/
int main(void)
{
    int t;
    BiTree b;
    //建立二叉树
    b=(BiTree)malloc(sizeof(BitNode));
    get_str();
    t=CreateBiTree_GList(b);

    Inorder(b);//按右根左遍历二叉树
    printf("\t_________________\n\t");
    printf("\n");


    return 0;
}

此贴为本人应用他人,主要是留给自己以后看的
2011-04-20 22:45
枫亭水榭
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2010-10-18
收藏
得分:0 
想问一个问题,可以按中序次序建立二叉树吗?
2011-04-24 23:58
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *l_child;
    struct node *r_child;
}*BTree;

BTree create(BTree tree)
{
    int temp;
    scanf("%d", &temp);

    if (temp == 0)
    {
        tree = NULL;
    }
    else
    {
        tree = (BTree) malloc (sizeof(struct node));

        tree->l_child = create(tree->l_child);
        scanf("%d", &tree->data);
        tree->r_child = create(tree->r_child);
    }

    return tree;
}

void show(BTree tree)
{
    if (tree != NULL)
    {
        show(tree->l_child);
        printf("%d ", tree->data);
        show(tree->r_child);
    }
}

int main(void)
{
    BTree tree = NULL;

    tree = create(tree);

    show(tree);

    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-04-25 09:19
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
上面是中序输入中序输出: 5 4 3 2 1

比较难看的
100 和 0 分别表示生成结点 和 不生成结点
 
2011-04-25 09:21
快速回复:二叉树的创建和打印、。。。
数据加载中...
 
   



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

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