博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树-线索二叉树
阅读量:5025 次
发布时间:2019-06-12

本文共 3315 字,大约阅读时间需要 11 分钟。

/*树-线索二叉树LJK 2017-07-05*/#include
#include
#include
#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef char TElemType;typedef int Status;/*Link == 0 表示指向左右孩子的指针Thread == 1 表示指向前驱或后继的线索*/typedef enum {Link,Thread} PointerTag;// 二叉线索存储节点结构typedef struct biThrNode{ TElemType data; // 节点数据 struct biThrNode *lchild, *rchild; // 左右孩子指针 PointerTag LTag, RTag; // 左右标志}BiThrNode;int index = 0;char String[] = "ABDH##I##EJ###CF##G##";Status visit(TElemType e){ printf("%c", e); return OK;}// 按前序输入二叉线索树中节点的值,构造二叉线索树Status CreateBiThrTree(BiThrNode **T){ TElemType ch; ch = String[index++]; if (ch == '#') *T = NULL; else { *T = (BiThrNode*)malloc(sizeof(BiThrNode)); if (!(*T)) exit(OVERFLOW); (*T)->data = ch; // 生成根节点(前序) CreateBiThrTree(&(*T)->lchild); // 构造左子树 if ((*T)->lchild)(*T)->LTag = Link; CreateBiThrTree(&(*T)->rchild); // 构造右子树 if ((*T)->rchild) (*T)->RTag = Link; } return OK;}BiThrNode *pre; // 全局变量,始终指向刚刚访问过的节点/* 中序遍历进行中序线索化 */void InThreading(BiThrNode *p){ if (p) { InThreading(p->lchild); // 递归左子树线索化 if (!p->lchild) // 没有左孩子 { p->LTag = Thread; // 前驱线索 p->lchild = pre; // 左孩子指针指向前驱 } if (!p->rchild) // 前驱没有右孩子 { pre->RTag = Thread; // 后继线索 pre->rchild = p; // 前驱右孩子指针指向后继(当前节点p) } pre = p; // 保持pre指向p的前驱 InThreading(p->rchild); // 递归右子树线索化 }}// 中序遍历二叉树T,并将其中序线索化,Thrt指向头节点Status InOrderThreading(BiThrNode **Thrt, BiThrNode *T){ *Thrt = (BiThrNode *)malloc(sizeof(BiThrNode)); // 建头节点 if (!(Thrt)) exit(OVERFLOW); (*Thrt)->LTag = Link; (*Thrt)->RTag = Thread; (*Thrt)->rchild = *Thrt; // 右指针回指 if (!(T)) (*Thrt)->lchild = *Thrt; // 若二叉树空,则左指针回指 else { (*Thrt)->lchild = T; // 头节点左孩子指向根节点 pre = (*Thrt); // pre指向头节点 InThreading(T); // 中序遍历进行中序线索化 pre->RTag = Thread; pre->rchild = *Thrt; // 最后一个节点线索化,指向头节点 (*Thrt)->rchild = pre; // 头节点线索化,指向最后一个节点 } return OK;}// 中序遍历二叉线索树T(头节点)的非递归算法Status InOrderTraverse_Thr(biThrNode *T){ BiThrNode *p; p = T->lchild; // p指向根节点 while (p != T) { // 空树或者遍历结束时, p == T while (p->LTag == Link) p = p->lchild; if (!visit(p->data)) // 访问其左子树为空的结点 return ERROR; while (p->RTag == Thread && p->rchild != T) // 有后继线索则直接指向后继结点 { p = p->rchild; visit(p->data); // 访问后继结点 } p = p->rchild; // 进入右子树 } return OK;}int main(){ BiThrNode *t, *h; PointerTag P; printf("按前序输入二叉树(如:'ABDH##I##EJ###CF##G##')\n"); CreateBiThrTree(&t); // 中序遍历,并中序线索化二叉树 InOrderThreading(&h, t); // 中序遍历(输出),二叉线索树 InOrderTraverse_Thr(h); printf("\n"); getchar(); return 0;}

 

转载于:https://www.cnblogs.com/IamJiangXiaoKun/p/9453390.html

你可能感兴趣的文章
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>
BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>
视频监控 封装[PlayCtrl.dll]的API
查看>>
软件工程APP进度更新
查看>>
Python 使用正则替换 re.sub
查看>>
CTF中那些脑洞大开的编码和加密
查看>>
简化工作流程 10款必备的HTML5开发工具
查看>>
c++ 调用外部程序exe-ShellExecuteEx
查看>>
Java进击C#——语法之知识点的改进
查看>>
IdentityServer流程图与相关术语
查看>>
BirdNet: a 3D Object Detection Framework from LiDAR information
查看>>
icon fonts入门
查看>>
【Django】如何按天 小时等查询统计?
查看>>
HDU2191(多重背包)
查看>>
测试用例(一)
查看>>
【转】 mysql反引号的使用(防冲突)
查看>>