#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
typedef char DataType;/*定义DataType类型*/
typedef enum {Link,Thread}PointerTag;
typedef struct node{
 DataType data;
 struct node *lchild, *rchild;/*左右孩子子树*/
 PointerTag LTag,RTag;
}BiThrNode; /*结点类型*/
typedef BiThrNode *BiThrTree ;/*二叉树类型*/
void  CreatBinTree(BiThrTree *T)
{ /*构造二叉链表,注意:输入序列是先序序列*/
 char ch;
 if ((ch=getchar())==' ')
  *T=NULL;
 else{ /*读入非空格*/
  *T=(BiThrNode *)malloc(sizeof(BiThrNode));/*生成结点*/
 (*T)->data=ch;(*T)->LTag=Link;(*T)->RTag=Link;
 CreatBinTree(&(*T)->lchild); /*构造左子树    */
 CreatBinTree(&(*T)->rchild); /*构造右子树*/
 }
}
BiThrTree pre;/*全局变量*/
void InThreading(BiThrTree p)
{
 if(p)
 {InThreading(p->lchild);/*左子树线索化*/
 if(!p->lchild){p->LTag=Thread;p->lchild=pre;}/*前驱线索*/
 if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}/*后继线索*/
 pre=p;/*保持pre指向p*/
 InThreading(p->rchild);/*右子树线索化*/
 }
}
int InOrderThreading(BiThrTree *Thrt,BiThrTree T)
                                  /*中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点*/
{ if(!(*Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
  (*Thrt)->LTag=Link;(*Thrt)->RTag=Thread;/*建头结点*/
  (*Thrt)->rchild=*Thrt;/*右指针回指*/
  if(!T) (*Thrt)->lchild=*Thrt;
  else
  { (*Thrt)->lchild=T;pre=*Thrt;
    InThreading(T);/*中序遍历进行中序线索化*/
 pre->rchild=*Thrt;pre->RTag=Thread;/*最后一个结点线索化*/
 (*Thrt)->rchild=pre;
  }
  return 1;
}
int print(BiThrTree e)
{printf("%d  %c  %d\n",e->LTag,e->data,e->RTag);return 1;}
int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e))
                                  /*T指向头结点,头结点的左链lchild指向根结点,中序遍厉二叉树*/
{BiThrTree p;
 p=T->lchild;/*p指向根结点*/
 while(p!=T)/*空树或遍厉结束时,p==T*/
 {while(p->LTag==Link) p=p->lchild;
  if(!visit(p)) return 0;/*打印*/
  while(p->RTag==Thread&&p->rchild!=T)
  {p=p->rchild;visit(p);}/*访问后继结点*/
  p=p->rchild;
 }
 return 1;
}
void main()
{ /*测试程序*/
 BiThrTree T,Thrt;CreatBinTree(&T);
    InOrderThreading(&Thrt,T);
    InOrderTraverse(Thrt,print);
}
/*可输入"-+a  *b  -c  d  /e  f  "来测试(注意空格)*/
www.caogenbiancheng.com(草根编程)

转载于:https://blog.51cto.com/1881149/352782

线索二叉树算法 - 草根编程网相关推荐

  1. 如何用ASP获取真实IP地址_草根编程

    大家都知道,在ASP中可以使用Request.ServerVariables("REMOTE_ADDR")来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代 ...

  2. 数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)...

    前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中 ...

  3. 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法

    重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...

  4. 线索二叉树代码实现 - 数据结构和算法49

    线索二叉树代码实现 让编程改变世界 Change the world by program   程序参考代码:http://bbs.fishc.com/forum-112-1.html [buy] 获 ...

  5. 【练习】2021下半年数据结构刷题笔记和总结 (二) 树、查找-- 不同的排序算法、二叉排序树 平衡二叉树、哈希表查找、线索二叉树、

    记录自己下半年写题目的记录.题目来自书或者网站. 练习(一)的地址: https://blog.csdn.net/qq_41358574/article/details/117098620?ops_r ...

  6. 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆

    第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 文章目录 第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 一.顺序存储二叉树 1.介绍 2.代码实现 二.线索二叉树 1 ...

  7. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  8. 编程基础 - 线索二叉树 (Threaded Binary Tree)

    编程基础 - 线索二叉树 (Threaded Binary Tree) 返回分类:全部文章 >> 基础知识 返回上级:编程基础 - 二叉树 (Binary Tree) 本文将介绍线索二叉树 ...

  9. 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)

    文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...

  10. 数据结构与算法(6-4)线索二叉树

    优势:便于在中序遍历下,查找前驱和后继. 前驱/后继含义:AB中,A是B前驱,B是A后继. ltag=0时:lchild指向左孩子                ltag=1时:lchild指向前驱 ...

最新文章

  1. 一步一步写自己的SqlHelper类库
  2. 计算机科学CSTA,学编程,搞懂CSTA K-12计算机科学学习标准
  3. 在Java项目用框架(hibernate)的前提下解决sql的union问题
  4. 打印页面横向怎么设置_条码打印软件标签纸页面设置的方法
  5. js 获取元素,同级元素下的子元素总结
  6. poi 默认2位小数_odoo小数精确度
  7. TypeError: this.getResolve is not a function
  8. 界面控件DevExpress WinForms v21.2 - 全新升级的图表控件
  9. 找101-200之间的素数(Java实现)
  10. 用matlab求解分支定界法,matlab分支定界法程序
  11. 近年来的Java面试题汇总。帮你圆大厂梦。
  12. R语言柯西(cauchy)分布
  13. 华为服务器显示110,ar110s路由器设置内部服务器
  14. 计算机体系结构--进制及其运算
  15. 基于Android的看小说APP源码Android本科毕业设计Android小说阅读器、小说APP源码
  16. 云服务器怎么划分虚拟主机,云服务器 划分虚拟主机
  17. 数值积分公式及龙贝格(Romberg)算法实现matlab
  18. load json文件时常见错误以及修正总结(亲测有效)
  19. cocos2d-x 关于旋转和移动的一点小技巧
  20. 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现

热门文章

  1. Selenium2(WebDriver)总结(一)---启动浏览器、设置profile加载插件
  2. SQL 语句性能查看
  3. 【程序员的自我修养——链接、装载与库】笔记
  4. LA 6047Perfect Matching(回文串哈希)
  5. Fluent NHibernate other example
  6. 【Codeforces 467C】George and Job
  7. P1164 小A点菜(动态规划背包问题)
  8. MySQL常用命令基础操作
  9. Python-Day2三级菜单
  10. 回溯算法解迷宫问题(java版)