| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 295 人关注过本帖
标题:二叉树的基本操作,在建立的就出问题
只看楼主 加入收藏
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:2 
二叉树的基本操作,在建立的就出问题
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define QueueMaxsize 20
#define StackMaxsize 10
typedef struct BTreeNode    // 构建一个二叉树
{
    char data;
    struct BTreeNode* left;
    struct BTreeNode* right;
}caicai;
void init(caicai** BT)      //初始化二叉树
{
    *BT=NULL;
}
void Preorder(caicai *BT)   //先序遍历,最先遍历根节点
{
    if(BT!=NULL)
    {
        printf("%c ",BT->data);
        Preorder(BT->left);
        Preorder(BT->right);
    }
}
void Inorder(caicai *BT)    //先遍历左子树,再遍历根节点,最后遍历右子树
{
    if(BT!=NULL)
    {
        Inorder(BT->left);
        printf("%c ",BT->data);    
        Inorder(BT->right);
    }
}
void Postorder(caicai *BT)   //根节点在最后遍历
{
    if(BT!=NULL)
    {
        Postorder(BT->left);
        Postorder(BT->right);
        printf("%c ",BT->data);        
    }
}
void Levelorder(caicai *BT)  //按层遍历法,非递归
{
    caicai *p,*q[QueueMaxsize];
    int front=0,rear=0;
    if(BT!=NULL)
    {
        rear=(rear+1)%QueueMaxsize;
        q[rear]=BT;
    }
    while(front!=rear)
    {
        front=(front+1)%QueueMaxsize;
        p=q[front];
        printf("%c ",p->data);
    }
    if(p->left!=NULL)
    {
        rear=(rear+1)%QueueMaxsize;
        q[rear]=p->left;
    }
    if(p->right!=NULL)
    {
        rear=(rear+1)%QueueMaxsize;
        q[rear]=p->right;
    }
}
void creat(caicai **BT,char *a)
{
    caicai *p,*s[StackMaxsize];
    int top=-1,k,i=0;
    *BT=NULL;
    while(a[i])
    {
        switch(a[i])
        {
        case' ':break;
        case'(':
            if(top==StackMaxsize-1)
            {
                printf("The stack is too small!\n");
                exit(1);
            }
            top++;
            s[top]=p;
            k=1;
            break;
        case')':
            if(top==-1)
            {
                printf("Error!\n");
                exit(1);
            }
            top--;
            break;
        case',':
            k=2;
            break;
        default:
            p=(caicai *)malloc(sizeof(caicai));
            p->data=a[i];
            p->left=p->left=NULL;
            if(*BT==NULL)
                *BT=p;
            else
                if(k==1)
                    s[top]->left=p;
                else
                    s[top]->right=p;
        }
        i++;
    }
}
int empty(caicai *BT)
{
    if(BT==NULL)
        return 1;
    else
        return 0;
}
int depth(caicai *BT)
{
    int dep1,dep2;
    if(BT==NULL)
        return 0;
    else
    {
        dep1=depth(BT->left);
        dep2=depth(BT->right);
    }
    if(dep1>dep2)
        return dep1;
    else
        return dep2;
}
char* find(caicai *BT,char x)
{
    if(BT==NULL)
        return NULL;
    else
    {
        if(BT->data==x)
            return &(BT->data);
        else
        {
            char *p;
            if(p=find(BT->left,x))
                return p;
            else if(p=find(BT->right,x))
                return p;
            else
                return NULL;
        }
    }
}
void print(caicai *BT)
{
    if(BT!=NULL)
    {
        printf("%c",BT->data);
        if(BT->left!=NULL || BT->right!=NULL)
        {
            printf("(");
            print(BT->left);
            if(BT->right!=NULL)
                printf(",");
            print(BT->right);
            printf(")");
        }
    }
}
void clear(caicai **BT)
{
    if(*BT!=NULL)
    {
        clear(&((*BT)->left));
        clear(&((*BT)->right));
        free(*BT);
        *BT=NULL;
    }
}
int main()
{
    caicai *bt;
    char b[50],x,*px;
    init(&bt);
    printf("输入二叉树广义表字符串:\n");
    scanf("%s",b);
    creat(&bt,b);
    print(bt);
    printf("\n");
    printf("前序:");
    Preorder(bt);
    printf("\n");
    printf("中序:");
    Inorder(bt);
    printf("\n");
    printf("后序:");
    Postorder(bt);
    printf("\n");
    printf("按层:");
    Levelorder(bt);
    printf("\n");
    printf("输入一个待查找的字符:\n");
    scanf(" %c",&x);
    px=find(bt,x);
    if(px)
        printf("查找成功:%c\n",*px);
    else
        printf("Fail!\n");
    printf("二叉树的深度为:");
    printf("%d\n",depth(bt));
    clear(&bt);
    return 0;
}

照着书敲的,好奇怪
搜索更多相关主题的帖子: color 二叉树 
2012-04-02 20:08
chinaflag
Rank: 2
来 自:福建泉州
等 级:论坛游民
帖 子:46
专家分:83
注 册:2012-4-1
收藏
得分:20 
我编译了一下  没有错误  运行 输入字符串结果出现内存地址0X00000007不能为wriren~
2012-04-02 21:26
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
收藏
得分:0 
书上给的测试数据时:
a(b(c),d(e(f,g),h(,i)))
2012-04-02 21:33
快速回复:二叉树的基本操作,在建立的就出问题
数据加载中...
 
   



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

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