鱼C论坛

 找回密码
 立即注册
查看: 3726|回复: 2

小甲鱼线索二叉树代码

[复制链接]
发表于 2019-8-31 21:17:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char ElemType;

  4. // 线索存储标志位
  5. // Link(0):表示指向左右孩子的指针
  6. // Thread(1):表示指向前驱后继的线索
  7. typedef enum {Link, Thread} PointerTag;



  8. typedef struct BiThrNode
  9. {
  10.     char data;
  11.     struct BiThrNode *lchild,*rchild;
  12.     PointerTag ltag;
  13.     PointerTag rtag;
  14. } BiThrNode,*BiThrTree;


  15. // 定义一个全局变量表示刚刚走过的节点
  16. BiThrTree pre;

  17. // 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
  18. void CreateBiThrTree(BiThrTree *T) {
  19.     char c;
  20.     scanf("%c",&c);

  21.     if ( ' ' == c ){
  22.         *T = NULL;
  23.     }else {
  24.         *T = (BiThrNode *)malloc(sizeof(BiThrNode));
  25.         (*T)->data = c;
  26.         (*T)->ltag = Link;
  27.         (*T)->rtag = Link;

  28.         CreateBiThrTree(&(*T)->lchild);
  29.         CreateBiThrTree(&(*T)->rchild);
  30.     }
  31. }

  32. // 中序遍历线索化

  33. void InThreading(BiThrTree T){
  34.     if ( T ) {
  35.         InThreading(T->lchild);  // 递归左孩子线索化

  36.         if( !T->lchild ){
  37.             T->ltag = Thread;
  38.             T->lchild = pre;
  39.         }
  40.         if ( !pre->rchild ){
  41.             pre->rtag = Thread;
  42.             pre->rchild = T;
  43.         }
  44.         pre = T;
  45.         InThreading(T->rchild);  // 递归右孩子线索化
  46.     }
  47. }

  48. // 初始化一个头指针
  49. void InOrderThreading( BiThrTree *p, BiThrTree T){
  50.     *p = (BiThrNode *)malloc(sizeof(BiThrNode));
  51.     (*p)->ltag = Link;
  52.     (*p)->rtag = Link;
  53.     (*p)->rchild = *p;
  54.     if (!T) {
  55.         (*p)->lchild = *p;
  56.     }else {
  57.         (*p)->lchild = T;
  58.         pre = *p;
  59.         InThreading(T);
  60.         pre->rchild = *p;
  61.         pre->rtag = Thread;
  62.         (*p)->rchild = pre;
  63.     }
  64. }

  65. void visit (char c){
  66.     printf("%c",c);
  67. }
  68. // 中序遍历二叉树,迭代
  69. void InOrderTraverse( BiThrTree T ) {
  70.     BiThrTree p;
  71.     p = T->lchild;

  72.     while( p!=T ){
  73.         while( p->ltag == Link ){
  74.             p = p->lchild;
  75.         }
  76.         visit(p->data);

  77.         while( p->rtag == Thread && p->rchild !=T ){
  78.             p = p->rchild;
  79.             visit(p->data);
  80.         }
  81.         p = p->rchild;
  82.     }


  83. }
  84. int main()
  85. {
  86.     BiThrTree P,T = NULL;

  87.     CreateBiThrTree( &T );

  88.     InOrderThreading( &P, T );

  89.     printf("中序遍历二叉树的结果为:");

  90.     InOrderTraverse( P );

  91.     printf("\n");

  92.     return 0;
  93. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-13 10:51:15 | 显示全部楼层
谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-27 15:28:36 | 显示全部楼层

第66行应该是(*p)->rtag = Thread;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 17:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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