| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1031 人关注过本帖
标题:先序线索化二叉树与中序线索化二叉树
只看楼主 加入收藏
Uni丶say
Rank: 1
等 级:新手上路
帖 子:5
专家分:6
注 册:2011-10-21
结帖率:100%
收藏
 问题点数:0 回复次数:3 
先序线索化二叉树与中序线索化二叉树
先序跟中序线索化二叉树的函数

先序线索化中为什么要加上这个if语句呢 想不明白

void InThreading(BitTree p)//中序线索化二叉树
{
    if(p)
    {
        InThreading(p->lchild);
        if(!p->lchild)
        {
            p->ltag=1;
            p->lchild=pre;
        }
        else
            p->ltag=0;
        if(!pre->rchild)
        {
            pre->rtag=1;
            pre->rchild=p;
        }
        else
            pre->rtag=0;
        pre=p;
        InThreading(p->rchild);
    }
}



void PreThreading(BitTree p)//先序线索化二叉树
{
    if(p)
    {
        if(!p->lchild)
        {
            p->ltag=1;
            p->lchild=pre;
        }
        else
            p->ltag=0;
        if(!pre->rchild)
        {
            pre->rtag=1;
            pre->rchild=p;
        }
        else
            pre->rtag=0;
        pre=p;
        if(p->ltag==0)//为什么要加上这个判断语句?
            PreThreading(p->lchild);
        PreThreading(p->rchild);
    }
}
搜索更多相关主题的帖子: void 二叉树 
2012-01-09 21:01
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
if(p->ltag==0)//为什么要加上这个判断语句?

加这句话的目的是由先序线索化决定的。
1、lchild有被复用,既指向左子树,又指向前一个指针;
2、在访问curnode时,如果需要对前一个指针处理,又需要保留左子树的位置,必须用一个标识符界定。
这个标识符就是ltag。

不清楚之处再发帖讨论。
2012-01-10 12:57
Uni丶say
Rank: 1
等 级:新手上路
帖 子:5
专家分:6
注 册:2011-10-21
收藏
得分:0 
程序代码:
#include "stdio.h"
#include "stdlib.h"
typedef enum piontertag{link,thread}Piontertag;
typedef struct bithrnode
{char data;

 Piontertag ltag,rtag;

 struct bithrnode *lchild,*rchild;
}BithrNODE;
BithrNODE *BithrCreat();
BithrNODE *InOrderThreading(BithrNODE *);
void InThreading(BithrNODE *);
void InOrderTraverse(BithrNODE *);
BithrNODE *pre;
int main(void)
{
    BithrNODE *a=BithrCreat();
    a=InOrderThreading(a);
    InOrderTraverse(a);
    return 0;
}
BithrNODE *BithrCreat()
{
    char x;
    scanf("%c%*c",&x);
    if(x=='#')
        return NULL;
    BithrNODE *p=(BithrNODE *)malloc(sizeof(BithrNODE ));
    p->data=x;
    p->rtag=p->ltag=link;
    p->lchild=BithrCreat();
    p->rchild=BithrCreat();
    return p;
}
BithrNODE*InOrderThreading(BithrNODE *a)
{
    BithrNODE *h=(BithrNODE *)malloc(sizeof(BithrNODE ));
    h->ltag=link;
    h->rtag=thread;
    h->rchild=h;
    if(!a)
        h->lchild=h;
    else
    {
        h->lchild=a;
        pre=h;
        InThreading(a);
        pre->rchild=h;
        pre->rtag=thread;
        h->rchild=pre;
    }
    return h;
}
void InThreading(BithrNODE *a)
{
    if(a)
    {
        if(!a->lchild)
        {
            a->ltag=thread;
            a->lchild=pre;
        }
        if(!pre->rchild)
        {
            pre->rtag=thread;
            pre->rchild=a;
        }
        pre=a;
        if(a->ltag==link)
            InThreading(a->lchild);
        InThreading(a->rchild);
    }
}
void InOrderTraverse(BithrNODE *a)
{
    BithrNODE *p=a->lchild;
    while(p!=a)
    {
        while(p->ltag==link&&p->rchild!=a)
        {
            printf("%c ",p->data);
            p=p->lchild;
        }
        printf("%c ",p->data);
        p=p->rchild;
    }
先序线索化二叉树 然后先序输出

输入两组数据 一组是ABC##D##E#F###

第一组是 ABC##D##E#F##
为什么第一组不输出

第二组却能正确输出呢
2012-01-11 17:51
Uni丶say
Rank: 1
等 级:新手上路
帖 子:5
专家分:6
注 册:2011-10-21
收藏
得分:0 
回复 2楼 silent_world
知道哪里错了 ····

谢谢
2012-01-11 17:57
快速回复:先序线索化二叉树与中序线索化二叉树
数据加载中...
 
   



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

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