鱼C论坛

 找回密码
 立即注册
查看: 6225|回复: 17

线索二叉树代码实现

[复制链接]
发表于 2013-8-15 15:13:21 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 宝宝吃肉 于 2013-8-16 00:45 编辑

跟着小甲鱼敲代码 验证了好几次 完全是copy类型的 可是错误百出 求大神帮忙 积攒了n多天的5个鱼币奉上  求不吝赐教
代码如下
#include<stdio.h>
#include<stdlib.h>


typedef char ElemType;

typedef enum{Link,Thread} PointerTag;

// 线索存储标志位
//Link(0):表示指向左右孩子的指针
//Thread(1):表示指向前去后继的线索

typedef struct BinThrNode
{
    char data;
        struct BinThrNode *lchild,*rchild;
        PointerTag ltag;
        PointerTag rtag;
}BinThrNode,*BinThrtree;

//全局变量,始终指向刚刚访问过的节点
BinThrTree pre;


void CreateBinThrtree(BinThrTree *T)
{
        char c;

        scanf("%c",&c);
        if(' '== c )
        {
            *T = NULL;
        }
        else
        {
            *T =(BinThrNode *)malloc(sizeof(BinThrNode));
        (*T)->data = c;
                (*T)->ltag = Link;
                (*T)->rtag = Link;

                CreateBinTree(&(*T)->lchild);
        CreateBinTree(&(*T)->rchild);
        }
}

void InThreading(BinThrTree T)
{
    if(T)
        {
            InThreading(T->lchild);//递归左孩子线索化
        if(!T->lchild)          //如果该节点没有左孩子,设置ltag为Thread,并把lchild指向上一个访问的节点
                {
                    T->ltag = Thread;
                        T->lchild = pre;
                }

                if(!pre->rchild)
                {
                    pre->rtag = Thread;
                        pre->rchild = T;
                }

        pre = T;

                InThreading(T->rchild);
        }
}

void InOrderThreading(BinThrTree *p,BinThrTree T)
{
    *p = (BinThrtree)malloc(sizeof(BinThrNode));
        (*p)->ltag = Link;
        (*p)->rtag = Thread;
        (*p)->rchild = *p;
        if(!T)
        {
            (*p)->lchild = *p;
        }
        else
        {
            (*p)->lchild = T;
                pre = *p;

                InThreading(T);
                pre->rchild = *p;
                pre->rtag = Thread;
                (*p)->rchild =pre;
        }
}
//中序遍历二叉树,非递归

void visit(char c)
{
    printf("%c",c);
}

void InOrderTraverse(BinThrTree T)
{
    BinThrTree p;
        p = T->lchild;

        while(p != T)
        {
            while (p->ltag == Link)
                {
                    p = p->lchild;
                }
                visit(p->data);

                while(p->rtag == Thread && p->rchild!=T)
                {
                    p = p->rchild;
                        visit(p->data);
                }
                p = p->rchild;
        }
}
// P头指针 T头节点
int main()
{
        BinThrTree P,T = NULL;

        CreateBinThrTree(&T);

        InOrderThreading(&P,T);

        printf("中序遍历输出:\n");

        InOrderTraverse( P );
        printf("\n");
    return 0;

}

最佳答案

查看完整内容

楼主,我今晚再把你的代码改了一下,把类型换成了int型的,因为char型的比较相同那里应该就有问题的,还有我上次改的那些,就可以得到想要的结果了,具体代码如下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-15 15:13:22 | 显示全部楼层
楼主,我今晚再把你的代码改了一下,把类型换成了int型的,因为char型的比较相同那里应该就有问题的,还有我上次改的那些,就可以得到想要的结果了,具体代码如下
  1. #include<stdio.h>
  2. #include<stdlib.h>


  3. typedef int ElemType;

  4. typedef enum{Link,Thread} PointerTag;

  5. // 线索存储标志位
  6. //Link(0):表示指向左右孩子的指针
  7. //Thread(1):表示指向前去后继的线索

  8. typedef struct BinThrNode
  9. {
  10.     int data;
  11.         struct BinThrNode *lchild,*rchild;
  12.         PointerTag ltag;
  13.         PointerTag rtag;
  14. }BinThrNode,*BinThrtree;

  15. //全局变量,始终指向刚刚访问过的节点
  16. BinThrNode *pre;


  17. void CreateBinThrtree(BinThrNode **T)
  18. {
  19.         int c;

  20.         scanf("%d",&c);
  21.         if(0== c )
  22.         {
  23.             *T = NULL;
  24.         }
  25.         else
  26.         {
  27.             *T =(BinThrNode *)malloc(sizeof(BinThrNode));
  28.                         (*T)->data = c;
  29.                 (*T)->ltag = Link;
  30.                 (*T)->rtag = Link;

  31.                 CreateBinThrtree(&(*T)->lchild);
  32.        CreateBinThrtree(&(*T)->rchild);
  33.         }
  34. }

  35. void InThreading(BinThrNode *T)
  36. {
  37.     if(T)
  38.         {
  39.             InThreading(T->lchild);//递归左孩子线索化
  40.         if(!T->lchild)          //如果该节点没有左孩子,设置ltag为Thread,并把lchild指向上一个访问的节点
  41.                 {
  42.                     T->ltag = Thread;
  43.                         T->lchild = pre;
  44.                 }

  45.                 if(!pre->rchild)
  46.                 {
  47.                     pre->rtag = Thread;
  48.                         pre->rchild = T;
  49.                 }

  50.         pre = T;

  51.                 InThreading(T->rchild);
  52.         }
  53. }

  54. void InOrderThreading(BinThrNode **p,BinThrNode *T)
  55. {
  56.     *p = (BinThrNode *)malloc(sizeof(BinThrNode));
  57.         (*p)->ltag = Link;
  58.         (*p)->rtag = Thread;
  59.         (*p)->rchild = *p;
  60.         if(!T)
  61.         {
  62.             (*p)->lchild = *p;
  63.         }
  64.         else
  65.         {
  66.             (*p)->lchild = T;
  67.                 pre = *p;

  68.                 InThreading(T);
  69.                 pre->rchild = *p;
  70.                 pre->rtag = Thread;
  71.                 (*p)->rchild =pre;
  72.         }
  73. }
  74. //中序遍历二叉树,非递归

  75. void visit(int c)
  76. {
  77.     printf("%d",c);
  78. }

  79. void InOrderTraverse(BinThrNode *T)
  80. {
  81.     BinThrNode *p;
  82.         p = T->lchild;

  83.         while(p != T)
  84.         {
  85.             while (p->ltag == Link)
  86.                 {
  87.                     p = p->lchild;
  88.                 }
  89.                 visit(p->data);

  90.                 while(p->rtag == Thread && p->rchild!=T)
  91.                 {
  92.                     p = p->rchild;
  93.                         visit(p->data);
  94.                 }
  95.                 p = p->rchild;
  96.         }
  97. }
  98. // P头指针 T头节点
  99. int main()
  100. {
  101.         BinThrNode *P,*T = NULL;

  102.          CreateBinThrtree(&T);

  103.         InOrderThreading(&P,T);

  104.         printf("中序遍历输出:\n");

  105.         InOrderTraverse( P );
  106.         printf("\n");
  107.     return 0;

  108. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-15 15:14:17 | 显示全部楼层
lz在线等     
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-15 16:33:32 | 显示全部楼层
你这样的求助没人看得懂,怪不得没人回复你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 00:30:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-17 20:47:55 | 显示全部楼层
求助啊                    
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-19 11:03:24 | 显示全部楼层
//修改了各个函数的形参,还有一个小错误就是楼主的标点符号用了中文,最后还是不能出到楼主想要的结果,在创建二叉树的时候用的是递归,但是好像没有结束条件,自己能力有限,等着牛人出现,哈哈!!
#include<stdio.h>
#include<stdlib.h>


typedef char ElemType;

typedef enum{Link,Thread} PointerTag;

// 线索存储标志位
//Link(0):表示指向左右孩子的指针
//Thread(1):表示指向前去后继的线索

typedef struct BinThrNode
{
    char data;
        struct BinThrNode *lchild,*rchild;
        PointerTag ltag;
        PointerTag rtag;
}BinThrNode,*BinThrtree;

//全局变量,始终指向刚刚访问过的节点
BinThrNode *pre;


void CreateBinThrtree(BinThrNode **T)
{
        char c;

        scanf("%c",&c);
        if(' '== c )
        {
            *T = NULL;
        }
        else
        {
            *T =(BinThrNode *)malloc(sizeof(BinThrNode));
        (*T)->data = c;
                (*T)->ltag = Link;
                (*T)->rtag = Link;

                CreateBinThrtree(&(*T)->lchild);
       CreateBinThrtree(&(*T)->rchild);
        }
}

void InThreading(BinThrNode *T)
{
    if(T)
        {
            InThreading(T->lchild);//递归左孩子线索化
        if(!T->lchild)          //如果该节点没有左孩子,设置ltag为Thread,并把lchild指向上一个访问的节点
                {
                    T->ltag = Thread;
                        T->lchild = pre;
                }

                if(!pre->rchild)
                {
                    pre->rtag = Thread;
                        pre->rchild = T;
                }

        pre = T;

                InThreading(T->rchild);
        }
}

void InOrderThreading(BinThrNode **p,BinThrNode *T)
{
    *p = (BinThrNode *)malloc(sizeof(BinThrNode));
        (*p)->ltag = Link;
        (*p)->rtag = Thread;
        (*p)->rchild = *p;
        if(!T)
        {
            (*p)->lchild = *p;
        }
        else
        {
            (*p)->lchild = T;
                pre = *p;

                InThreading(T);
                pre->rchild = *p;
                pre->rtag = Thread;
                (*p)->rchild =pre;
        }
}
//中序遍历二叉树,非递归

void visit(char c)
{
    printf("%c",c);
}

void InOrderTraverse(BinThrNode *T)
{
    BinThrNode *p;
        p = T->lchild;

        while(p != T)
        {
            while (p->ltag == Link)
                {
                    p = p->lchild;
                }
                visit(p->data);

                while(p->rtag == Thread && p->rchild!=T)
                {
                    p = p->rchild;
                        visit(p->data);
                }
                p = p->rchild;
        }
}
// P头指针 T头节点
int main()
{
        BinThrNode *P,*T = NULL;

         CreateBinThrtree(&T);

        InOrderThreading(&P,T);

        printf("中序遍历输出:\n");

        InOrderTraverse( P );
        printf("\n");
    return 0;

}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-27 09:37:10 | 显示全部楼层
zZ_小春 发表于 2013-8-25 21:40
楼主,我今晚再把你的代码改了一下,把类型换成了int型的,因为char型的比较相同那里应该就有问题的,还有我 ...

谢谢                  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-27 22:24:28 | 显示全部楼层

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-17 19:56:33 | 显示全部楼层
我认为这段代码中不用递归的时候,那段非递归的代码有问题,  
while(p->rtag == Thread && p->rchild!=T)
                {
                    p = p->rchild;
                        visit(p->data);
                }

初始化的时候,明明rtag都赋值为0了,什么时候编程的thread
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-17 19:58:49 | 显示全部楼层
还有就是中序遍历时,为什么处理节点在中间,不在开始啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-3 20:58:47 | 显示全部楼层
zZ_小春 发表于 2013-8-15 15:13
楼主,我今晚再把你的代码改了一下,把类型换成了int型的,因为char型的比较相同那里应该就有问题的,还有我 ...

你这样的求助没人看得懂,怪不得没人回复你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-16 14:17:59 | 显示全部楼层
找资源的孩子总是穿梭游走在各个帖子与板块之间,见资源就下,见贴就顶,争取早日拿到灌水大师勋章。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-23 13:11:07 | 显示全部楼层
路过看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-23 22:31:02 | 显示全部楼层
:shock:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-26 22:19:23 | 显示全部楼层
:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-28 00:48:36 | 显示全部楼层
支持楼主!德玛西亚!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-28 09:25:57 | 显示全部楼层
:sad
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 21:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表