| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 849 人关注过本帖
标题:求各位高手帮看一段二叉树程序
只看楼主 加入收藏
yxm870915
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-2-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
求各位高手帮看一段二叉树程序
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTree
{
    int elem;
    struct BiTree *Lchild;
    struct BiTree *Rchild;
}BiNode;

void BiT_Create(BiNode *T,int x)
{
    BiNode *Temp;
    BiNode *New;

    Temp=T;
    if(T->elem==-1)
    {
        T->elem=x;
        T->Lchild=NULL;
        T->Rchild=NULL;
        return;
    }
    else if(Temp->elem>=x)
    {
        if(Temp->Lchild==NULL)
        {
            if((New=(BiNode*)malloc(sizeof(BiNode)))!=NULL)
            {
                New->elem=x;
                New->Lchild=NULL;
                New->Rchild=NULL;
                Temp->Lchild=New;
            }
        }
        else
            BiT_Create(Temp->Lchild,x);
    }
    else
    {
        if(Temp->Rchild==NULL)
        {
            if((New=(BiNode*)malloc(sizeof(BiNode)))!=NULL)
            {
                New->elem=x;
                New->Lchild=NULL;
                New->Rchild=NULL;
                Temp->Rchild=New;
            }
        }
        else
            BiT_Create(Temp->Rchild,x);
    }
}
void BiT_Init(BiNode *T,int array[],int size)
{
    int i;
    for(i=0;i<size;i++)
        BiT_Create(T,array[i]);
}

void BiT_Print(BiNode *T)
{
    BiNode *Temp;
    Temp=T;
    if(!Temp)
        return;

    BiT_Print(Temp->Lchild);
    printf("%d;",Temp->elem);
    BiT_Print(Temp->Rchild);

}
int BiT_Search(BiNode *T,int x,int size)
{
    int i=0;
    BiNode *Temp;
    Temp=T;
    if(i<size)
    {
        if(Temp->elem==x)
            return 1;
        else if(Temp->elem>=x&&Temp->Lchild!=NULL)
            BiT_Search(Temp->Lchild,x,size);
        else if(Temp->elem<x&&Temp->Rchild!=NULL)
            BiT_Search(Temp->Rchild,x,size);
        else
            return 0;
    }

}

void BiT_Delete(BiNode *T)
{
    BiNode *Temp;
    BiNode *Trans;
    Temp=T;
    if(Temp->Lchild==NULL)
    {
        T=T->Rchild;
        free(Temp);
    }
    else if(Temp->Rchild==NULL)
    {
        T=T->Lchild;
        free(Temp);
    }
    else
    {   
        Trans=T->Lchild;
        while(Trans->Rchild)
        {
            Temp=Trans;
            Trans=Trans->Rchild;
        }
        T->elem=Trans->elem;
        if(Temp!=T)
            Temp->Rchild=Trans->Rchild;
        else
            Temp->Lchild=Trans->Lchild;
        free(Trans);
    }
}

int BiT_Delenode(BiNode *T,int x)
{
    BiNode *Temp;
    Temp=T;

    if(!Temp)
        return 0;
    else
    {
        if(Temp->elem==x)
        {
            BiT_Delete(Temp);
            return 1;
        }
        else if(Temp->elem>x)
            BiT_Delenode(Temp->Lchild,x);
        else
            BiT_Delenode(Temp->Rchild,x);
    }
}

   

void main()
{
    BiNode *T;
    int *array;
    int size;
    int i;

    printf("Input the size of the ARRAY:");
    scanf("%d",&size);
    array=(int*)malloc(size*sizeof(int));
    for(i=0;i<size;i++)
    {
        printf("Input the elem of No.%d in the ARRAY:",i);
        scanf("%d",&array[i]);
    }
    T=(BiNode*)malloc(sizeof(BiNode));
    T->elem=-1;
    T->Lchild=NULL;
    T->Rchild=NULL;
    BiT_Init(T,array,size);
    BiT_Delenode(T,3);
    BiT_Print(T);
    BiT_Search(T,2,size);
    free(T);
}
为什么在执行int BiT_Delenode(BiNode *T,int x)的时候会报read的溢出错误?求解.......
搜索更多相关主题的帖子: 二叉树 
2011-02-12 14:40
yxm870915
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-2-10
收藏
得分:0 
补充一下除了那两段以Del开头的函数其他的都已经测试过可以运行了,估计就是在那里出的问题
2011-02-12 14:46
cacker
该用户已被删除
收藏
得分:4 
提示: 作者被禁止或删除 内容自动屏蔽
2011-02-12 19:48
yxm870915
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-2-10
收藏
得分:0 
回复 3楼 cacker
我写的这个是二叉排序树,那个删除的算法是在书上找的伪指令自己补上的,逻辑应该没问题但是就不知道是哪里出问题了....
2011-02-12 20:19
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-02-12 21:18
yxm870915
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-2-10
收藏
得分:0 
回复 5楼 cacker
恩,就是这个地方执行了delet以后print就不听话了....我纠结了半天也没找到错误....
2011-02-12 21:32
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:4 
最近写个程序刚好要用到二叉树的知识,我现在正在恶补

勤能补拙,熟能生巧!
2011-02-12 22:16
yxm870915
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-2-10
收藏
得分:0 
回复 7楼 huangapple
俺也是啊.....红黑树简直就是噩梦啊.....掩面泪奔....
2011-02-12 22:56
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-02-13 01:03
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:4 
节点删除有问题,想想链表怎么删除吧,要知道被删除的前驱节点。
      T=T->Rchild;
只用这个是不行的。
void BiT_Delete(BiNode *pre,BiNode *T)
{
    BiNode *Temp;
    BiNode *Trans;
    Temp=T;
    if(Temp->Lchild==NULL)
    {
        if(Temp==pre->Lchild)
            pre->Lchild=Temp->Rchild;
        else
            pre->Rchild=Temp->Rchild;
        free(Temp);
    }
    else if(Temp->Rchild==NULL)
    {
        if(Temp==pre->Lchild)
            pre->Lchild=Temp->Lchild;
        else
            pre->Rchild=Temp->Lchild;
        free(Temp);
    }
    else
    {   
        Trans=T->Lchild;
        while(Trans->Rchild)
        {
            Temp=Trans;
            Trans=Trans->Rchild;
        }
        T->elem=Trans->elem;
        if(Temp!=T)
            Temp->Rchild=Trans->Rchild;
        else
            Temp->Lchild=Trans->Lchild;
        free(Trans);
    }
}

int BiT_Delenode(BiNode *pre,BiNode *T,int x)
{
    BiNode *Temp;
    Temp=T;

    if(!Temp)
        return 0;
    else
    {
        if(Temp->elem==x)
        {
            BiT_Delete(pre,Temp);
            return 1;
        }
        else if(Temp->elem>x)
            BiT_Delenode(T,Temp->Lchild,x);
        else
            BiT_Delenode(T,Temp->Rchild,x);
    }
}
时间不够只改了待删除节点有一个子节点的
2011-02-13 08:44
快速回复:求各位高手帮看一段二叉树程序
数据加载中...
 
   



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

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