| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 884 人关注过本帖
标题:各位高手帮忙改错。。
只看楼主 加入收藏
Vi_No
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2009-5-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
各位高手帮忙改错。。
这个代码好像有问题。。执行一半会退出。。请问怎么改。。。。。

#include <iostream>

using namespace std;

enum PointerTag {Link, Thread};

typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag LTag, RTag;
}BiThrNode, *BiThrTree;
BiThrTree T, pre = NULL;

void CreateBiTree(BiThrTree &T)
{
    //先序建立二叉树
    char ch;
    scanf("%c", &ch);
    if (ch == '*')
        T = NULL;
    else
    {
        if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
            exit(-1);
        T->data = ch;
        T->LTag = Link;
        T->RTag = Link;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }   
}

void PreThreading(BiThrTree P)
{
    //先序遍历线索化二叉树
    if (P)
    {
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        if (P->LTag == Link)
            PreThreading(P->lchild);
        if (P->RTag == Link)
            PreThreading(P->rchild);
    }
}

void preOrderThr(BiThrTree T)
{
    //遍历先序线索二叉树
    BiThrTree p = T;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->LTag == Link)
            p = p->lchild;
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void InThreading(BiThrTree P)
{
    //中序遍历线索化二叉树
    if (P)
    {
        InThreading(P->lchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        InThreading(P->rchild);
    }
}

void inOrderThr(BiThrTree T)
{
    //遍历中序线索二叉树
    BiThrTree p = T;
    while (p->LTag == Link)
        p = p->lchild;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->RTag == Link)
        {
            p = p->rchild;
            while (p->LTag == Link)
                p = p->lchild;
        }
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void PostThreading(BiThrTree P)
{
    //后序遍历线索化二叉树
    if (P)
    {
        PostThreading(P->lchild);
        PostThreading(P->rchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
    }
}

int main()
{
    //建立二叉树
    cout << "请按先序输入二叉树各元素值,"
         << "其中*代表空:\n";
    CreateBiTree(T);

    //先序遍历线索化二叉树
    cout << "先序遍历线索化二叉树:\n";
    PreThreading(T);
    cout << endl;

    //遍历先序线索二叉树
    cout << "遍历先序线索二叉树:\n";
    preOrderThr(T);
    cout << endl;

    //中序遍历线索化二叉树
    cout << "中序遍历线索化二叉树:\n";
    InThreading(T);
    cout << endl;

    //遍历中序线索二叉树
    cout << "遍历中序线索二叉树:\n";
    inOrderThr(T);
    cout << endl;

    //后序遍历线索化二叉树
    cout << "后序遍历线索化二叉树:\n";
    pre = NULL;
    PostThreading(T);
    cout << endl;

    return 0;
}

[ 本帖最后由 Vi_No 于 2010-4-27 22:02 编辑 ]
搜索更多相关主题的帖子: 改错 
2010-04-27 20:03
Vi_No
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2009-5-15
收藏
得分:0 
弱弱地问一句。。为什么此贴被无视了。。。
2010-05-02 17:29
LegendofMine
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-02 17:45
Vi_No
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2009-5-15
收藏
得分:0 
回复 3楼 LegendofMine
看出结果了么。
2010-05-02 22:06
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序没有语法错误
但是 要注意  BiThrTree T, pre = NULL 这是全局变量
  pre的值 在每次用的时候 要记得初始化 为 0
  不要把T 声明 成全局变量  
因为 后面的操作 把它的值改变了 因为是直接P = T 的   这样 操作P 就等同于T
2010-05-03 21:11
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
    char ch[5];
    scanf("%s", ch);
    //getchar();
    if (ch[0] == '*')
        T = NULL;
    else
    {
        if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
            exit(-1);
        T->data = ch[0];
        T->LTag = Link;
        T->RTag = Link;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }

两种处理输入方法
2010-05-03 23:09
Vi_No
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2009-5-15
收藏
得分:0 
回复 6楼 寒风中的细雨
内个啥。。你5楼说的T不要设置成全局变量发贴之前我就试过的。而且pre的值每次都有改为NULL。 输入处理应该没问题吧。
2010-05-03 23:41
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
图片附件: 游客没有浏览图片的权限,请 登录注册

一次遍历 没有问题  
但是 要 进行后面就 不行  因为 T 变了
指针型的 设不设 一样
#include <iostream>

using namespace std;

enum PointerTag {Link, Thread};

typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag LTag, RTag;
}BiThrNode, *BiThrTree;

BiThrTree pre = NULL;

void CreateBiTree(BiThrTree &T)
{
    //先序建立二叉树
    char ch[5];
    scanf("%s", ch);
    //getchar();
    if (ch[0] == '*')
        T = NULL;
    else
    {
        if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
            exit(-1);
        T->data = ch[0];
        T->LTag = Link;
        T->RTag = Link;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }   
}

void copy(BiThrTree T, BiThrTree &temp)
{
    if(!T)
        temp = NULL;
    else
    {
        if(!(temp = (BiThrTree) malloc(sizeof(BiThrNode))) )
            exit(1);
        temp->data = T->data;
        temp->LTag = Link;
        temp->RTag = Link;
        copy(T->lchild, temp->lchild);
        copy(T->rchild, temp->rchild);
    }
}
        
void PreThreading(BiThrTree P)
{
    //先序遍历线索化二叉树
    if (P)
    {
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        if (P->LTag == Link)
            PreThreading(P->lchild);
        if (P->RTag == Link)
            PreThreading(P->rchild);
    }
}

void preOrderThr(BiThrTree T)
{
    //遍历先序线索二叉树
    BiThrTree p = T;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->LTag == Link)
            p = p->lchild;
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void InThreading(BiThrTree P)
{
    //中序遍历线索化二叉树
    if (P)
    {
        InThreading(P->lchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        InThreading(P->rchild);
    }
}

void inOrderThr(BiThrTree T)
{
    //遍历中序线索二叉树
    BiThrTree p = T;
    while (p->LTag == Link)
        p = p->lchild;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->RTag == Link)
        {
            p = p->rchild;
            while (p->LTag == Link)
                p = p->lchild;
        }
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void PostThreading(BiThrTree P)
{
    //后序遍历线索化二叉树
    if (P)
    {
        PostThreading(P->lchild);
        PostThreading(P->rchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
    }
}

int main()
{
    BiThrTree T=NULL, temp=NULL;

    //建立二叉树
    cout << "请按先序输入二叉树各元素值,"
         << "其中*代表空:\n";
    CreateBiTree(T);
    copy(T, temp);

    //先序遍历线索化二叉树
    cout << "先序遍历线索化二叉树:\n";
    PreThreading(temp);
    cout << endl;

    //遍历先序线索二叉树
    cout << "遍历先序线索二叉树:\n";
    preOrderThr(temp);
    cout << endl;

    free( temp );
    temp = NULL;
    copy( T, temp);

    //中序遍历线索化二叉树
    cout << "中序遍历线索化二叉树:\n";
    InThreading(T);
    cout << endl;

    //遍历中序线索二叉树
    cout << "遍历中序线索二叉树:\n";
    inOrderThr(T);
    cout << endl;

    free( temp );
    temp = NULL;
    copy( T, temp);
   
    //后序遍历线索化二叉树
    cout << "后序遍历线索化二叉树:\n";
    pre = NULL;
    PostThreading(T);
    cout << endl;

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

2010-05-04 07:23
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
#include <iostream>

using namespace std;

enum PointerTag {Link, Thread};

typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag LTag, RTag;
}BiThrNode, *BiThrTree;

BiThrTree pre = NULL;

void CreateBiTree(BiThrTree &T)
{
    //先序建立二叉树
    char ch[5];
    scanf("%s", ch);
    //getchar();
    if (ch[0] == '*')
        T = NULL;
    else
    {
        if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
            exit(-1);
        T->data = ch[0];
        T->LTag = Link;
        T->RTag = Link;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }   
}

void copy(BiThrTree T, BiThrTree &temp)
{
    if(!T)
        temp = NULL;
    else
    {
        if(!(temp = (BiThrTree) malloc(sizeof(BiThrNode))) )
            exit(1);
        temp->data = T->data;
        temp->LTag = Link;
        temp->RTag = Link;
        copy(T->lchild, temp->lchild);
        copy(T->rchild, temp->rchild);
    }
}
        
void PreThreading(BiThrTree P)
{
    //先序遍历线索化二叉树
    if (P)
    {
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        if (P->LTag == Link)
            PreThreading(P->lchild);
        if (P->RTag == Link)
            PreThreading(P->rchild);
    }
}

void preOrderThr(BiThrTree T)
{
    //遍历先序线索二叉树
    BiThrTree p = T;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->LTag == Link)
            p = p->lchild;
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void InThreading(BiThrTree P)
{
    //中序遍历线索化二叉树
    if (P)
    {
        InThreading(P->lchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
        InThreading(P->rchild);
    }
}

void inOrderThr(BiThrTree T)
{
    //遍历中序线索二叉树
    BiThrTree p = T;
    while (p->LTag == Link)
        p = p->lchild;
    printf("%c ", p->data);
    while (p->rchild)
    {
        if (p->RTag == Link)
        {
            p = p->rchild;
            while (p->LTag == Link)
                p = p->lchild;
        }
        else
            p = p->rchild;
        printf("%c ", p->data);
    }
}

void PostThreading(BiThrTree P)
{
    //后序遍历线索化二叉树
    if (P)
    {
        PostThreading(P->lchild);
        PostThreading(P->rchild);
        printf("%c ", P->data);
        if (!P->lchild)
        {
            P->LTag = Thread;
            P->lchild = pre;
        }
        if (!P->rchild)
            P->RTag = Thread;
        if (pre && pre->RTag == Thread)
            pre->rchild = P;
        pre = P;
    }
}

int main()
{
    BiThrTree T=NULL, temp=NULL;

    //建立二叉树
    cout << "请按先序输入二叉树各元素值,"
         << "其中*代表空:\n";
    CreateBiTree(T);
    copy(T, temp);

    //先序遍历线索化二叉树
    cout << "先序遍历线索化二叉树:\n";
    PreThreading(temp);
    cout << endl;

    //遍历先序线索二叉树
    cout << "遍历先序线索二叉树:\n";
    preOrderThr(temp);
    cout << endl;

    free( temp );
    temp = NULL;
    copy( T, temp);

    //中序遍历线索化二叉树
    cout << "中序遍历线索化二叉树:\n";
    InThreading(temp);
    cout << endl;

    //遍历中序线索二叉树
    cout << "遍历中序线索二叉树:\n";
    inOrderThr(temp);
    cout << endl;

    free( temp );
    temp = NULL;
    copy( T, temp);

   
    free( temp );
    temp = NULL;
    copy( T, temp);
   
    //后序遍历线索化二叉树
    cout << "后序遍历线索化二叉树:\n";
    //pre = NULL;
    PostThreading(temp);
    cout << endl;

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

2010-05-04 07:28
Vi_No
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2009-5-15
收藏
得分:0 
回复 8楼 寒风中的细雨
悲剧。其实出错的原因是知道的。当初急着交作业就把两个单纯的遍历函数改成遍历销毁二叉树了。完全没想到复制。还是版主的方法好。谢谢。
2010-05-04 08:30
快速回复:各位高手帮忙改错。。
数据加载中...
 
   



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

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