| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 646 人关注过本帖
标题:求助,中序线索化二叉树问题
只看楼主 加入收藏
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
结帖率:97.44%
收藏
已结贴  问题点数:20 回复次数:8 
求助,中序线索化二叉树问题
#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 100
#define Link 0
#define Thread 1

typedef struct BiThrTreeNode
{
    char info;
    struct BiThrTreeNode *l_link;
    struct BiThrTreeNode *r_link;
    int LTag,RTag;
}BiThrTreeNode,*BiThrTree;


typedef struct SeqStack
{
    BiThrTree s[MAX_SIZE];
    int t;
}*PSeqStack;

PSeqStack createEmptyStack_seq(void)
{
    PSeqStack p_stack;

    p_stack=(PSeqStack)malloc(sizeof(struct SeqStack));

    if(NULL==p_stack)
    {
        printf("\n out of space!\n");
        exit(-1);
    }
    else
    {
        p_stack->t=-1;//表示以满堆栈的方式存放数据
    }
    return p_stack;
}

bool isEmptyStack_seq(PSeqStack p_stack)
{
    return p_stack->t==-1;
}

void push_seq(PSeqStack p_stack,BiThrTree bt)
{
    if(p_stack->t>=MAX_SIZE-1)
    {
        printf("\tOverflow!\n");
        exit(-1);
        ++p_stack->t;
        p_stack->s[p_stack->t]=bt;
    }
}


void pop_seq(PSeqStack p_stack)
{
    if(p_stack->t==-1)
    {
        printf("\tUnderflow!\n");
        exit(-1);
    }
    --p_stack->t;
}

BiThrTree top_seq(PSeqStack p_stack)
{
    if(isEmptyStack_seq(p_stack))
    {
        printf("\tNo data!\n");
    }
    return p_stack->s[p_stack->t];
}

BiThrTree createBiThrTree()    //先序创建二叉树
{
    char ch;
    BiThrTree T;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL;
    else
    {
        T=(BiThrTree)malloc(sizeof(BiThrTreeNode));
        if(!T)
            exit(0);
        T->info=ch;
        T->LTag=Link;
        T->RTag=Link;
        T->l_link=createBiThrTree();
        T->r_link=createBiThrTree();
    }
    return T;
}
void thread(BiThrTree bt)        //按对称序线索化二叉树
{
    PSeqStack p_stack=createEmptyStack_seq();
   
    BiThrTree p,pre;
    if(bt==NULL)
        return;
    p=bt;
    pre=NULL;
    do
    {
        while(p!=NULL)
        {
            push_seq( p_stack,p);    //遇到结点推入栈中,然后进入左子树中
            p=p->l_link;
        }
        printf("*****************\n");
        p=top_seq(p_stack);
        pop_seq(p_stack);
        if(pre!=NULL)
        {
            
            if(pre->r_link==NULL)    //修改前驱结点的右指针
            {
                pre->r_link=p;
                pre->RTag=Thread;
            }
            if(p->l_link==NULL)    //修改前驱结点的左指针
            {
                p->l_link=pre;
                p->LTag=Thread;
            }
            pre=p;
            p=p->r_link;    //进入右子树
        }
    }while(!isEmptyStack_seq(p_stack)||p!=NULL);
}
void visit(BiThrTree bt)
{
    printf("%c",bt->info);
}
void InOder(BiThrTree bt)    //按对称序遍历对称序线索二叉树
{
    BiThrTree p=bt;
    if(bt==NULL)
        return;
    while(p->l_link!=NULL&&p->LTag==Link)
        p=p->l_link;        //顺左子树一直向下
    while(p!=NULL)
    {
        visit(p);
        if(p->r_link!=NULL&&p->RTag==Link)//右子树不是线索时
        {
            p=p->r_link;
            while(p->l_link!=NULL&&p->LTag==Link)
            p=p->l_link;        //顺右子树的左子树一直向下
        }
        else
            p=p->r_link;    //顺线索向下
    }
}
int main()
{
    BiThrTree bt;
    BiThrTree    thrNode=NULL;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入#:\n");
    printf("<说明:例如参考数据为:abc##de#g##f###,输完后再输入一个回车键.>\n");
    bt=createBiThrTree();
    printf("中序线索化二叉树:\n");
    thread(bt);
    printf("线索化工作已经完成!\n");
    printf("中序遍历线索二叉树:\n");
    InOder(bt);
    return 0;
}
搜索更多相关主题的帖子: 二叉树 
2011-04-10 11:58
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
求版主,指点
2011-04-11 12:00
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
贴上来什么也不说 以为是好的  给大家参考滴
2011-04-11 12:13
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
线索化时,元素进不了栈
2011-04-11 12:17
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
push_seq( p_stack,p);    //遇到结点推入栈中,然后进入左子树中
这里的p_stack貌似指错位置了
2011-04-11 12:19
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
求版主帮忙看看
2011-04-11 12:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 100
#define Link 0
#define Thread 1

typedef struct BiThrTreeNode
{
    char info;
    struct BiThrTreeNode *l_link;
    struct BiThrTreeNode *r_link;
    int LTag,RTag;
}BiThrTreeNode,*BiThrTree;


typedef struct SeqStack
{
    BiThrTree s[MAX_SIZE];
    int t;
}*PSeqStack;

PSeqStack createEmptyStack_seq(void)
{
    PSeqStack p_stack;

    p_stack=(PSeqStack)malloc(sizeof(struct SeqStack));

    if(NULL==p_stack)
    {
        printf("\n out of space!\n");
        exit(-1);
    }
    else
    {
        p_stack->t=-1;//表示以满堆栈的方式存放数据
    }
    return p_stack;
}

bool isEmptyStack_seq(PSeqStack p_stack)
{
    return p_stack->t==-1;
}

void push_seq(PSeqStack p_stack,BiThrTree bt)
{
    if(p_stack->t>=MAX_SIZE-1)
    {
        printf("\tOverflow!\n");
        exit(-1);
    }
    ++p_stack->t;
    p_stack->s[p_stack->t]=bt;
}


void pop_seq(PSeqStack p_stack)
{
    if(p_stack->t==-1)
    {
        printf("\tUnderflow!\n");
        exit(-1);
    }
    --p_stack->t;
}

BiThrTree top_seq(PSeqStack p_stack)
{
    if(isEmptyStack_seq(p_stack))
    {
        printf("\tNo data!\n");
    }
    return p_stack->s[p_stack->t];
}

BiThrTree createBiThrTree()    //先序创建二叉树
{
    char ch;
    BiThrTree T;
    scanf("%c",&ch);
    getchar();
    if(ch=='#')
        T=NULL;
    else
    {
        T=(BiThrTree)malloc(sizeof(BiThrTreeNode));
        if(!T)
            exit(0);
        T->info=ch;
        T->LTag=Link;
        T->RTag=Link;
        T->l_link=createBiThrTree();
        T->r_link=createBiThrTree();
    }
    return T;
}

void print( BiThrTree T )
{
    if ( NULL != T )
    {
        printf("%c\n",  T->info );

        print( T->l_link );
        print( T->r_link );
    }
}

void thread(BiThrTree bt)        //按对称序线索化二叉树
{
    PSeqStack p_stack=createEmptyStack_seq();
   
    BiThrTree p,pre;
    if(bt==NULL)
        return;
    p=bt;
    pre=NULL;//指向前驱
    do
    {
        while(p!=NULL)
        {
            push_seq( p_stack,p);    //遇到结点推入栈中,然后进入左子树中
            p=p->l_link;
        }
        printf("*****************\n");
        p=top_seq(p_stack);//要遍历的结点
        pop_seq(p_stack);
        if (NULL != pre)
        {
           
            if(pre->r_link==NULL)    //修改前驱结点的右指针
            {
                pre->r_link=p;
                pre->RTag=Thread;
            }
            if(p->l_link==NULL)    //修改前驱结点的左指针
            {
                p->l_link=pre;
                p->LTag=Thread;
            }
            pre=p;
            p=p->r_link;    //进入右子树
        }
        else// (NULL == pre)
        {
            pre = p;
            pre->LTag = Thread;
            pre->l_link = NULL;//设置第一个结点的前驱指向NULL
            p = p->r_link;
        }
    }while(!isEmptyStack_seq(p_stack));

    pre->r_link = NULL;
}

void visit(BiThrTree bt)
{
    printf("%c ",bt->info);
}

void InOder(BiThrTree bt)    //按对称序遍历对称序线索二叉树
{
    BiThrTree p=bt;
    if(bt==NULL)
        return;
//    while(p->l_link!=NULL&&p->LTag==Link)
//        p=p->l_link;        //顺左子树一直向下
    while (p->l_link!=NULL)
    {
        p = p->l_link;
    }
    while(p!=NULL)
    {
        visit(p);
        if(p->r_link!=NULL&&p->RTag==Link)//右子树不是线索时
        {
            p=p->r_link;
            while(p->l_link!=NULL&&p->LTag==Link)
            p=p->l_link;        //顺右子树的左子树一直向下
        }
        else
            p=p->r_link;    //顺线索向下
    }
}
int main()
{
    BiThrTree bt;
    BiThrTree    thrNode=NULL;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入#:\n");
    printf("<说明:例如参考数据为:abc##de#g##f###,输完后再输入一个回车键.>\n");
    bt=createBiThrTree();
    //print( bt );
    printf("中序线索化二叉树:\n");
    thread(bt);
    printf("线索化工作已经完成!\n");
    printf("中序遍历线索二叉树:\n");
    InOder(bt);

    return 0;
}
2011-04-11 18:44
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 

谢谢,版主
版主也是一狂热的追星族?顶起
2011-04-11 22:12
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
对了,能不能劳烦版主把错的地方阐述下
2011-04-11 22:51
快速回复:求助,中序线索化二叉树问题
数据加载中...
 
   



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

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