| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1348 人关注过本帖
标题:二叉树建立问题,帮忙看看错误在哪里?
取消只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:9 
二叉树建立问题,帮忙看看错误在哪里?
#include <stdio.h>
#include <stdlib.h>

typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

char prelist[3]={'b','a','c'};//前序序列
char inlist[3]={'a','b','c'};//中序序列
char postlist[3]={'a','c','b'};//后序序列


void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
///////二叉树的遍历
void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);//递归调用
        PreOrderTraverse(T->rchild);//递归调用
    }
}
////////////////////////////////////////////




int nodenum=3;//序列中的节点数
BiTNode *tree1;//根指针
int CreatBTrecurison(int starta,int enda,int startb,int endb,BiTNode **root)//已知前序和中序序列构建二叉树
{
    int t1,t2;
    if(starta>enda)//序列区间中的元素已经被访问完
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));   
        (*root)->data=prelist[starta];//先序序列的第一个元素为根结点
        t1=startb;
        t2=-1;
        while(t1<=endb)//在中序序列中找子树的根节点
            if(inlist[t1]==prelist[starta])//找到子树的根节点
            {
                t2=t1;
                t1=endb+1;
            }
            else//继续后找
                t1++;
            if(t2==-1)//找不到子树的根
                return 0;
            if(CreatBTrecurison(starta+1,enda+t2-startb,startb,t2-1,&((*root)->lchild))==0)//递归调用建立左子树
                return 0;
            if(CreatBTrecurison(starta+t2-startb+1,enda,t2+1,endb,&((*root)->rchild))==0)//递归调用建立右子树
                return 0;
            return 1;
    }
}
void CreateBinaryTree()
{
    tree1=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison(0,nodenum-1,0,nodenum-1,&tree1);
};

//*******************************************************************************************************


BiTNode *tree2;
int CreatBTrecurison2(int starta,int enda,int startb,int endb,BiTNode **root)//已知中序和后序序列构建二叉树
{
    int t1,t2;
    if(starta>enda)
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));
        (*root)->data=postlist[enda];//后序序列的最后一个元素为根结点
        t1=startb;
        t2=-1;
        while(t1<=endb)
            if(inlist[t1]==postlist[enda])//在中序序列中找子树的根节点
            {
                t2=t1;
                t1=endb+1;
            }
            else
                t1++;
            if(t2==-1)
                return 0;
            if(CreatBTrecurison2(starta,starta+t2-startb,startb,t2-1,&((*root)->lchild))==0)
                return 0;
            if(CreatBTrecurison2(starta+t2-startb+1,enda-1,t2+1,endb,&((*root)->rchild))==0)
                return 0;
            return 1;
    }
}
void CreateBinaryTree2()
{
    tree2=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison2(0,nodenum-1,0,nodenum-1,&tree2);
};
void main()
{
    CreateBinaryTree();
    printf("输出构建的二叉树的中序遍历结果:\n");
    PreOrderTraverse(tree1);//输出已知前序和中序序列构建的二叉树中序遍历结果
    printf("\n");
    CreateBinaryTree2();
    printf("输出构建的二叉树的中序遍历结果:\n");
    PreOrderTraverse(tree2);//输出已知中序和后序序列构建的二叉树中序遍历结果
    printf("\n");
}
搜索更多相关主题的帖子: 二叉树 
2010-06-04 17:23
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

运行的时候出现这种情况,算法我仔细检查并模拟过了,应该没有问题,谁能帮忙看看一看,谢谢!
2010-06-04 19:43
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
大侠帮帮忙啊,有急用,万分感谢!
2010-06-05 07:44
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

char prelist[3]={'b','a','c'};//前序序列
char inlist[3]={'a','b','c'};//中序序列
char postlist[3]={'a','c','b'};//后序序列


void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
///////二叉树的遍历
void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);//递归调用
        PreOrderTraverse(T->rchild);//递归调用
    }
}
////////////////////////////////////////////




int nodenum=3;//序列中的节点数
BiTNode *tree1;//根指针
int CreatBTrecurison(int starta,int enda,int startb,int endb,BiTNode **root)//已知前序和中序序列构建二叉树
{
    int t1,t2;
    if(starta>enda)//序列区间中的元素已经被访问完
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));   
        (*root)->data=prelist[starta];//先序序列的第一个元素为根结点
        (*root)->lchild=(*root)->rchild=NULL;////
        t1=startb;
        t2=-1;
        while(t1<=endb)//在中序序列中找子树的根节点
            if(inlist[t1]==prelist[starta])//找到子树的根节点
            {
                t2=t1;
                t1=endb+1;
            }
            else//继续后找
                t1++;
            if(t2==-1)//找不到子树的根
                return 0;
            if(CreatBTrecurison(starta+1,enda+t2-startb,startb,t2-1,&((*root)->lchild))==0)//递归调用建立左子树
                return 0;
            if(CreatBTrecurison(starta+t2-startb+1,enda,t2+1,endb,&((*root)->rchild))==0)//递归调用建立右子树
                return 0;
            return 1;
    }
}
void CreateBinaryTree()
{
   tree1=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison(0,nodenum-1,0,nodenum-1,&tree1);
};

//*******************************************************************************************************


BiTNode *tree2;
int CreatBTrecurison2(int starta,int enda,int startb,int endb,BiTNode **root)//已知中序和后序序列构建二叉树
{
    int t1,t2;
    if(starta>enda)
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));
        (*root)->data=postlist[enda];//后序序列的最后一个元素为根结点
        (*root)->lchild=(*root)->rchild=NULL;//////
        t1=startb;
        t2=-1;
        while(t1<=endb)
            if(inlist[t1]==postlist[enda])//在中序序列中找子树的根节点
            {
                t2=t1;
                t1=endb+1;
            }
            else
                t1++;
            if(t2==-1)
                return 0;
            if(CreatBTrecurison2(starta,starta+t2-startb,startb,t2-1,&((*root)->lchild))==0)//左子树
                return 0;
            if(CreatBTrecurison2(starta+t2-startb+1,enda-1,t2+1,endb,&((*root)->rchild))==0)//右子树
                return 0;
            return 1;
    }
}
void CreateBinaryTree2()
{
    tree2=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison2(0,nodenum-1,0,nodenum-1,&tree2);
};
void main()
{
    CreateBinaryTree();
    printf("输出构建的二叉树的中序遍历结果:\n");
    PreOrderTraverse(tree1);//输出已知前序和中序序列构建的二叉树中序遍历结果
    printf("\n");
    CreateBinaryTree2();
    printf("输出构建的二叉树的中序遍历结果:\n");
    PreOrderTraverse(tree2);//输出已知中序和后序序列构建的二叉树中序遍历结果
    printf("\n");
}

谢谢楼上,你能再帮我检查一下第二个算法(已知中序和后序序列构建的二叉树)的问题吗,运行结果不对,该如何改呢,谢谢!
2010-06-05 12:33
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

可能是第二个算法中 if(CreatBTrecurison2(starta,starta+t2-startb,startb,t2-1,&((*root)->lchild))==0)//左子树
 if(CreatBTrecurison2(starta+t2-startb+1,enda-1,t2+1,endb,&((*root)->rchild))==0)//右子树
中的边界确定有问题,我认为是对的,不知道哪里错了
2010-06-05 12:38
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
int CreatBTrecurison(int tagL,int starta,int enda,int startb,int endb,BiTNode **root)//
{
    int i;
    if(starta>enda)//序列区间中的元素已经被访问完
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));   
        (*root)->data=prelist[starta];//先序序列的第一个元素为根结点
        (*root)->lchild=(*root)->rchild=NULL;////
        for (i=startb; i<=endb&&((*root)->data!=inlist[i]); i++);
    ///////////////
        if(tagL==1)
        {
            CreatBTrecurison(1, starta+1, i, startb, i-1,&((*root)->lchild));
            CreatBTrecurison(0, i+1, enda, i+1, endb-1, &((*root)->rchild));
        }
        else
        {
            CreatBTrecurison(1, starta+1, i, startb, i-1,&((*root)->lchild));
            CreatBTrecurison(0, starta+1, enda, i+1, endb-1, &((*root)->rchild));
        }
            return 1;
    }
}
void CreateBinaryTree()
{
   tree1=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison(1,0,nodenum-1,0,nodenum-1,&tree1);
};

第一个算法这么改还是不对呢,再帮我看看...
2010-06-05 21:49
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
麻烦7楼再帮我看一下嘛,再改一下第一个算法,我明天就要交了,非常感谢!
2010-06-06 11:22
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

char prelist[5]={'a','b','d','c','e'};//前序序列
char inlist[5]={'b','d','a','e','c'};//中序序列
char postlist[5]={'d','b','e','c','a'};//后序序列


void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
    printf("%c",e);
}
///////二叉树的遍历
void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法
{
    if(T)
    {
        Visit(T->data);
        PreOrderTraverse(T->lchild);//递归调用
        PreOrderTraverse(T->rchild);//递归调用
    }
}
////////////////////////////////////////////




int nodenum=5;//序列中的节点数
BiTNode *tree1;//根指针
int CreatBTrecurison(int tagL,int starta,int enda,int startb,int endb,BiTNode **root)//
{
    int i;
    if(starta>enda)//序列区间中的元素已经被访问完
    {
        *root=NULL;
        return 1;
    }
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));   
        (*root)->data=prelist[starta];//先序序列的第一个元素为根结点
        (*root)->lchild=(*root)->rchild=NULL;////
        for (i=startb; i<=endb&&((*root)->data!=inlist[i]); i++);
    ///////////////
        if(tagL==1)
        {
            CreatBTrecurison(1, starta+1, i, startb, i-1,&((*root)->lchild));
            CreatBTrecurison(0, i+1, enda, i+1, endb-1, &((*root)->rchild));
        }
        else
        {
            CreatBTrecurison(1, starta+1, enda, startb, i-1,&((*root)->lchild));
            CreatBTrecurison(0, i+1, enda, i+1, endb-1, &((*root)->rchild));
        }
            return 1;
    }
}
void CreateBinaryTree()
{
   tree1=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison(1,0,nodenum-1,0,nodenum-1,&tree1);
};

BiTNode *tree2;
int CreatBTrecurison2(int tagL, int starta,int enda,int startb,int endb,BiTNode **root)//
{
    int i;
    if(starta>enda)
        return 1;
    else
    {
        *root=(BiTree)malloc(sizeof(BiTNode));
        (*root)->data=postlist[endb];//后序序列的最后一个元素为根结点
        (*root)->lchild=(*root)->rchild=NULL;//////
        for (i=starta; i<=enda&&((*root)->data!=inlist[i]); i++);
        if (tagL==1)
        {
            CreatBTrecurison2(1, starta, i-1, startb, i-1,&((*root)->lchild));
            CreatBTrecurison2(0, i+1, enda, i, endb-1, &((*root)->rchild));
        }
        else
        {
            CreatBTrecurison2(1, starta, i-1, startb, endb-1,&((*root)->lchild));
            CreatBTrecurison2(0, i+1, enda, i, endb-1, &((*root)->rchild));
        }
        return 1;
    }
}
void CreateBinaryTree2()
{
    tree2=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison2(1, 0, nodenum-1, 0, nodenum-1, &tree2);
};
void main()
{
    CreateBinaryTree();
    printf("输出构建的二叉树的先序遍历结果:\n");
    PreOrderTraverse(tree1);//输出已知前序和中序序列构建的二叉树先序遍历结果
    printf("\n");
    CreateBinaryTree2();
    printf("输出构建的二叉树的先序遍历结果:\n");
    PreOrderTraverse(tree2);//输出已知中序和后序序列构建的二叉树先序遍历结果
    printf("\n");
}

再帮忙看看第一个的算法,我改了,还是不对呢?
2010-06-06 15:54
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
哪位高手再帮我看一下怎么改?
2010-06-07 16:30
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int findposition(char ch,char b[],int l,int h)  //在b[l]~b[h]的范围内寻找字符ch是否存在,若存在则返回其所在位置的下标
{     
    int k;
    k=l;
    while(ch!=b[k]&&k<=h)
        k++;
    if(k>h)//对数据进行合法性检查
    {
        printf("error\n");
        exit(0);
    }
    else
        return(k);//返回其所在位置的下标
}


//已知先序序列和中序序列构建二叉树
BiTree Create(char a[],int l1,int h1,char b[],int l2,int h2)
{
    int k;
    BiTree t;
    if(l1>h1)//序列区间中没有元素,是一棵空树 
        return NULL;
    else
        if(l1==h1)//区间长度为1,则该结点就是根结点
        {
            t=(BiTree)malloc(sizeof(BiTNode));
            t->data=a[l1];
            t->lchild=NULL;//不要忘了初始化
            t->rchild=NULL;
        }
        else
        {
            k=findposition(a[l1],b,l2,h2);//在中序序列中找子树的根节点的位置k
            t=(BiTree)malloc(sizeof(BiTNode));
            t->data=a[l1];//先序序列的第一个元素为根结点
            t->lchild=Create(a,l1+1,l1+k-l2,b,l2,k-1);//递归构建左子树l1+(k-l2)
            t->rchild=Create(a,k+l1-l2+1,h1,b,k+1,h2);//递归构建右子树
        }
        return(t);//返回结点的指针
}


//已知中序序列和后序序列构建二叉树
BiTree Create2(char a[],int l1,int h1,char b[],int l2,int h2)
{
    int k;
    BiTree t;
    if(l2>h2) 
        return NULL;
    else
        if(l2==h2)
        {
            t=(BiTree)malloc(sizeof(BiTNode));
            t->data=b[h2];
            t->lchild=NULL;
            t->rchild=NULL;
        }
        else
        {
            k=findposition(b[h2],a,l1,h1);
            t=(BiTree)malloc(sizeof(BiTNode));
            t->data=b[h2];//后序序列的最后一个元素为根结点
            t->lchild=Create2(a,l1,k-1,b,l2,l2+k-l1-1);//递归构建左子树l2+k-l1-1
            t->rchild=Create2(a,k+1,h1,b,l2+k-l1,h2-1);//递归构建右子树          
        }
        return(t);
}

void PostTraverse(BiTree t)   /*后序遍历二叉树*/
{
    if(t)
    {  
        PostTraverse(t->lchild);
        PostTraverse(t->rchild);
        printf("%c",t->data);   
    } 
}
void PreTraverse(BiTree t)   /*先序遍历二叉树*/
{
    if(t)
    {  
        printf("%c",t->data);
        PreTraverse(t->lchild);
        PreTraverse(t->rchild);           
    } 
}

void main( )
{
    BiTree t;
    int n,m,l;
    char a[MAX],b[MAX],c[MAX];
    printf("参考数据:\nabdce  bdaec  dbeca\n");
    printf("    a    \n");
    printf("  b   c   \n");
    printf(" * d e *   \n");
    printf("---------------------------------\n");
    printf("请输入先序遍历序列:\n");
    scanf("%s",a);
    printf("请输入中序遍历序列:\n");
    scanf("%s",b);
    printf("请输入后序遍历序列:\n");
    scanf("%s",c);
    n=strlen(a);
    m=strlen(b);
    l=strlen(c);
    t=Create(a,0,n-1,b,0,m-1);
    printf("<------------------------------->\n");
    printf("已知先序和中序求得的后序遍历结果:\n");
    PostTraverse(t);
    printf("\n");
    printf("<------------------------------->\n");
    printf("已知中序和后序求得的先序遍历结果:\n");
    t=Create2(b,0,m-1,c,0,l-1);
    PreTraverse(t);
    printf("\n");
}

图片附件: 游客没有浏览图片的权限,请 登录注册


实现的功能:
1.已知前序和中序序列构建的二叉树
2.已知中序和后序序列构建的二叉树

已在VC++6.0环境下运行通过,供大家参考!

2010-07-02 22:39
快速回复:二叉树建立问题,帮忙看看错误在哪里?
数据加载中...
 
   



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

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