| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1348 人关注过本帖
标题:二叉树建立问题,帮忙看看错误在哪里?
只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:11 
二叉树建立问题,帮忙看看错误在哪里?
#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
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
初始化问题,你在构建树时,看看无左孩子和右孩子的是否赋值为NULL, 你没有初始化为NULL。
(*root)->data=prelist[starta];//先序序列的第一个元素为根结点
(*root)->lchild = NULL;
唉,这个问题我在论坛上不知提到过多少次了,我自己都记不清了,你们下一次,一定要培养考虑初始化的习惯。

还有,贴代码时,把函数放在main函数后面,函数声明放在main函数前面。养成良好的代码习惯。(原因是只要一看函数声明就大约知道程序是干什么的)


[ 本帖最后由 hzh512 于 2010-6-5 09:23 编辑 ]

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-06-05 09:13
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
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:30 
两个算法均有逻辑错误,只给你写第二个,第一个自己练习

程序代码:
BiTNode *tree2;
int CreatBTrecurison2(bool 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 == true)
        {
            CreatBTrecurison2(true, starta, i-1, startb, i-1,&((*root)->lchild));
            CreatBTrecurison2(false, i+1, enda, i, endb-1, &((*root)->rchild));
        }
        else
        {
            CreatBTrecurison2(true, starta, i-1, startb, endb-1,&((*root)->lchild));
            CreatBTrecurison2(false, i+1, enda, i, endb-1, &((*root)->rchild));
        }
        return 1;
    }
}
void CreateBinaryTree2()
{
    tree2=(BiTree)malloc(sizeof(BiTNode));
    CreatBTrecurison2(true, 0, nodenum-1, 0, nodenum-1, &tree2);
};


编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-06-05 19:09
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
快速回复:二叉树建立问题,帮忙看看错误在哪里?
数据加载中...
 
   



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

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