1. /*
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院
  3. * All rights reserved.
  4. * 文件名称:wu.cpp
  5. * 作    者:陈朋
  6. * 完成日期:2016年11月11日
  7. * 版 本 号:v1.0
  8. *问题描述:实现中序线索化二叉树的算法验证,并测试数据。
  9. *输入描述:无
  10. *程序输出:测试数据
  11. */
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MaxSize 100
  4. typedef char ElemType;
  5. typedef struct node
  6. {
  7. ElemType data;
  8. int ltag,rtag;      //增加的线索标记
  9. struct node *lchild;
  10. struct node *rchild;
  11. } TBTNode;
  12. void CreateTBTNode(TBTNode * &b,char *str)
  13. {
  14. TBTNode *St[MaxSize],*p=NULL;
  15. int top=-1,k,j=0;
  16. char ch;
  17. b=NULL;             //建立的二叉树初始时为空
  18. ch=str[j];
  19. while (ch!='\0')    //str未扫描完时循环
  20. {
  21. switch(ch)
  22. {
  23. case '(':
  24. top++;
  25. St[top]=p;
  26. k=1;
  27. break;      //为左结点
  28. case ')':
  29. top--;
  30. break;
  31. case ',':
  32. k=2;
  33. break;                          //为右结点
  34. default:
  35. p=(TBTNode *)malloc(sizeof(TBTNode));
  36. p->data=ch;
  37. p->lchild=p->rchild=NULL;
  38. if (b==NULL)                    //*p为二叉树的根结点
  39. b=p;
  40. else                            //已建立二叉树根结点
  41. {
  42. switch(k)
  43. {
  44. case 1:
  45. St[top]->lchild=p;
  46. break;
  47. case 2:
  48. St[top]->rchild=p;
  49. break;
  50. }
  51. }
  52. }
  53. j++;
  54. ch=str[j];
  55. }
  56. }
  57. void DispTBTNode(TBTNode *b)
  58. {
  59. if (b!=NULL)
  60. {
  61. printf("%c",b->data);
  62. if (b->lchild!=NULL || b->rchild!=NULL)
  63. {
  64. printf("(");
  65. DispTBTNode(b->lchild);
  66. if (b->rchild!=NULL) printf(",");
  67. DispTBTNode(b->rchild);
  68. printf(")");
  69. }
  70. }
  71. }
  72. TBTNode *pre;                       //全局变量
  73. void Thread(TBTNode *&p)
  74. {
  75. if (p!=NULL)
  76. {
  77. Thread(p->lchild);          //左子树线索化
  78. if (p->lchild==NULL)        //前驱线索
  79. {
  80. p->lchild=pre;          //建立当前结点的前驱线索
  81. p->ltag=1;
  82. }
  83. else p->ltag=0;
  84. if (pre->rchild==NULL)      //后继线索
  85. {
  86. pre->rchild=p;          //建立前驱结点的后继线索
  87. pre->rtag=1;
  88. }
  89. else pre->rtag=0;
  90. pre=p;
  91. Thread(p->rchild);          //右子树线索化
  92. }
  93. }
  94. TBTNode *CreaThread(TBTNode *b)     //中序线索化二叉树
  95. {
  96. TBTNode *root;
  97. root=(TBTNode *)malloc(sizeof(TBTNode));  //创建根结点
  98. root->ltag=0;
  99. root->rtag=1;
  100. root->rchild=b;
  101. if (b==NULL)                //空二叉树
  102. root->lchild=root;
  103. else
  104. {
  105. root->lchild=b;
  106. pre=root;               //pre是*p的前驱结点,供加线索用
  107. Thread(b);              //中序遍历线索化二叉树
  108. pre->rchild=root;       //最后处理,加入指向根结点的线索
  109. pre->rtag=1;
  110. root->rchild=pre;       //根结点右线索化
  111. }
  112. return root;
  113. }
  114. void ThInOrder(TBTNode *tb)
  115. {
  116. TBTNode *p=tb->lchild;      //指向根结点
  117. while (p!=tb)
  118. {
  119. while (p->ltag==0) p=p->lchild;
  120. printf("%c ",p->data);
  121. while (p->rtag==1 && p->rchild!=tb)
  122. {
  123. p=p->rchild;
  124. printf("%c ",p->data);
  125. }
  126. p=p->rchild;
  127. }
  128. }
  129. int main()
  130. {
  131. TBTNode *b,*tb;
  132. CreateTBTNode(b,"A(B(D(,G)),C(E,F))");
  133. printf(" 二叉树:");
  134. DispTBTNode(b);
  135. printf("\n");
  136. tb=CreaThread(b);
  137. printf(" 线索中序序列:");
  138. ThInOrder(tb);
  139. printf("\n");
  140. return 0;
  141. }
  142. 运行结果:

第十一周项目1——二叉树算法验证(3) 中序线索化二叉树的算法验证相关推荐

  1. node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树

    1.中序线索化二叉树   创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点.   线索化二叉树的规则:   ...

  2. java线索二叉树的实现_JAVA递归实现线索化二叉树

    JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...

  3. 数据结构上机实践第10周项目1 - 二叉树算法验证

    二叉树算法验证 本次实践主要是对于二叉树算法的验证,达成对于算法熟练掌握的目的. 实践所用的二叉树算法库点击此处可以参考(编译环境:VC++6.0) 一.层次遍历算法验证 验证具体要求如下: 实现二叉 ...

  4. 线索二叉树原理及前序、中序线索化(Java版)

    转载 原文地址:https://blog.csdn.net/UncleMing5371/article/details/54176252 一.线索二叉树原理 前面介绍二叉树原理及特殊二叉树文章中提到, ...

  5. 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

    二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...

  6. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  7. LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

    二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...

  8. 通过中序线索二叉树找某节点的后续前驱☆

    题目:写出在中序线索二叉树里查找指定节点在后序的前驱结点的算法 分析:         在后序序列中,若节点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱.若节点p左右子女均无, ...

  9. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  10. 中序线索二叉树(C语言实现)

    目录 1.线索二叉树的定义: 2.线索二叉树的存储结构: 3.创建中序线索二叉树 4.遍历中序线索二叉树 5.在中序线索二叉树上查找任意结点的中序前驱结点 6.在中序线索二叉树上查找任意结点的中序后继 ...

最新文章

  1. 【工具】Internet Download Manager( IDM )抓取站点
  2. ld-linux-x86-64.so.2+,RedHat6安装Oracle数据库遇到错误 C [ld-linux-x86-64.so.2+0x14d70]
  3. Java消息中间件(activeMQ)
  4. Ajax系统学习总结
  5. html5引擎笔试题,最新!HTML5经典面试题型(附答案)
  6. ftp同一主机的多个子进程使用同一个套接字_linux进程通信方式对比
  7. shell mysql awk_shell mysql 处理数据小结
  8. Android Animation学习(三) ApiDemos解析:XML动画文件的使用
  9. CentOS6.5下安装mongodb
  10. AVR工具指南(二)
  11. POJ NOI0105-45 金币
  12. 人类的终极目标是什么?
  13. 云锁卸载 linux,ubuntu下云锁卸载出错后无法重新安装的解决办法checking installation environment:...
  14. T229473 D. 背单词的小智(二分)
  15. 计算机cpu风扇不转怎么办,如果计算机启动时cpu风扇不旋转,该怎么办?解决方法[详细说明]...
  16. tinkpad e450c 进入 BIOS
  17. iOS使用UICollectionView只允许向左方向滑动,不允许向右方向滑动。
  18. 爬取雪球网股票信息(一)
  19. TI高精度实验室ADC系列培训视频 第3章和第4章 ADC噪声分析
  20. cocos creator实例--CocosCreator实现的 解救人质 游戏,学会碰撞检测

热门文章

  1. java使用POI导出Excel,下拉列表联动,单元格合并,日期校验,锁定指定列禁止修改
  2. 计算机硬盘如何制作成移动硬盘,电脑拆出来的闲置硬盘别扔 这么做帮你把它变成移动硬盘...
  3. 谈中国分布式数据库商业之路:OSM与DB-Inside
  4. ps渐变怎么用和渐变工具技巧
  5. 一台手机第一天支付1元,第二天支付2元,第三天支付4元,连续支付30天,请问一共需要支付多少钱?
  6. 安卓zip解压软件_破解软件之“安卓压缩包zip或rar密码破解(116位数任意破)”...
  7. 计算机图形学:光线追踪原理(ray tracing)
  8. 信创环境下密码强度规则:设置密码长度为6至20位,包含大、小写字母、数字、特殊字符组合
  9. 十年磨一剑,奋进新征程!麒麟信安在上交所科创板成功上市
  10. 3d人体智能测试软件,人体系统女性3Dapp