#include<stdio.h>
#include<stdlib.h> typedef char ElemType;
typedef enum{Link,Thread} PointerTag; //Link为1,表示连接左孩子;Thread为0,表示连接前继项; //创建二叉树的结点;
typedef struct BiThrNode
{
ElemType data;
BiThrNode *lchild, *rchild;
PointerTag ltag;
PointerTag rtag;
}BiThrNode, *BiThrTree; BiThrTree pre; //设置一个全局变量,用来存储前继结点的信息; //创建二叉树,遵循前序遍历;
int CreatBiThrTree(BiThrTree *T)
{
char c;
scanf_s("%c", &c);
if (' ' == c)
{
*T = NULL;
}
else
{
*T = (BiThrNode *)malloc(sizeof(BiThrNode));
(*T)->data = c;
(*T)->ltag = Link;
(*T)->rtag = Link;
CreatBiThrTree(&(*T)->lchild); //采用递归,初始化左孩子,下同;
CreatBiThrTree(&(*T)->rchild);
}
return ;
} //创建二叉树线索函数,遵循中序遍历;
int BiThreading(BiThrTree T)
{
if (T)
{
BiThreading(T->lchild);
if (!T->lchild)
{
T->ltag = Thread;
T->lchild = pre;
}
if (!pre->rchild)
{
pre->rtag = Thread;
pre->rchild = T;
}
pre = T;
BiThreading(T->rchild);
}
return ;
} //创建头结点;
int in_Threading(BiThrTree T, BiThrTree *p)
{
(*p) = (BiThrNode *)malloc(sizeof(BiThrNode));
(*p)->ltag = Link;
(*p)->rtag = Thread;
(*p)->rchild = *p;
if (!T)
{
(*p)->lchild = *p;
}
else
{
(*p)->lchild = T;
pre = *p; //将创建的头结点p赋给pre;
BiThreading(T);
pre->rtag = Thread; //进行收尾工作,形成一个类似于闭合的双向链表;
pre->rchild = *p;
(*p)->rchild = pre;
}
return ;
} //递归方法,二叉树前序遍历;
int Pre_Order_Traverse(BiThrTree T, int level)
{
printf("递归前序遍历的结果为:\n");
if (!T)
{
return ;
}
else
{
printf("第%d层:%c", level, T->data);
Pre_Order_Traverse(T->lchild, level + ); //递归遍历左孩子,下同;
Pre_Order_Traverse(T->rchild, level + );
}
return ;
} //非递归的方法,二叉树中序遍历,二叉树已存在头结点和线索;
int In_Order_Traverse(BiThrTree T)
{
if (T)
{
BiThrTree P;
P = T->lchild;
while (P != T)
{
while (P->ltag == Link)
{
P= P->lchild;
}
printf("%c/n", P->data);
while (P->rtag == Thread&&P->rchild != T)
{
P = P->rchild;
printf("%c/n", P->data);
}
P = P->rchild;
}
}
return ;
} //主函数部分;
int main()
{
int level = ;
BiThrTree T,p;
CreatBiThrTree(&T);
Pre_Order_Traverse(T, level);
in_Threading(T, &p);
In_Order_Traverse(T);
}

线索二叉树【C语言】的更多相关文章

  1. 数据结构之线索二叉树——C语言实现

     线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...

  2. 数据结构之---C语言实现线索二叉树

    //线索二叉树,这里在二叉树的基础上增加了线索化 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef char ElemTy ...

  3. 【Java】 大话数据结构(9) 树(二叉树、线索二叉树)

    本文根据<大话数据结构>一书,对Java版的二叉树.线索二叉树进行了一定程度的实现. 另: 二叉排序树(二叉搜索树) 平衡二叉树(AVL树) 二叉树的性质 性质1:二叉树第i层上的结点数目 ...

  4. 数据结构《9》----Threaded Binary Tree 线索二叉树

    对于任意一棵节点数为 n 的二叉树,NULL 指针的数目为  n+1 , 线索树就是利用这些 "浪费" 了的指针的数据结构. Definition: "A binary ...

  5. 线索二叉树Threaded binary tree

    摘要   按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点.这 ...

  6. 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化

    遍历二叉树   traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...

  7. 树和二叉树->线索二叉树

    文字描述 从二叉树的遍历可知,遍历二叉树的输出结果可看成一个线性队列,使得每个结点(除第一个和最后一个外)在这个线形队列中有且仅有一个前驱和一个后继.但是当采用二叉链表作为二叉树的存储结构时,只能得到 ...

  8. 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  9. 后序线索二叉树中查找结点*p的后继

    在后序线索二叉树中查找结点*p的后继: 1.若结点*p为根,则无后继:2.若结点*p为其双亲的右孩子,则其后继为其双亲:3.若结点*p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲:4.若结点*p ...

  10. 线索二叉树的理解和实现(Java)

    线索二叉树的基本概念 我们按某种方式对二叉树进行遍历,将二叉树中所有节点排序为一个线性序列,在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结 ...

随机推荐

  1. 百度LBS云搜索时报错 &quot;filter:area is not filteable field, please set property in the cloud-storage

    {"status":2,"message":"filter:area is not filteable field, please set prope ...

  2. oracle 创建暂时表

    提交事务后会自己主动清空,不同的事务之间数据隔离 create global temporary table GLS_REPORT_EXPR (   EXPRNO VARCHAR2(30) not n ...

  3. 备忘录模式之C++实现

    说明:本文仅供学习交流.转载请标明出处,欢迎转载.  备忘录模式是一种比較简单的设计模式.该模式非常好地体现了一种面向对象的封装思想. 该模式的思想是用一个专门的备份类将当前的状态信息保存起来.在整个 ...

  4. luogu2346 四子连棋

    题目大意 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以 ...

  5. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...

  6. [转]Dialog

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  7. Linux基础命令第二波

    第1章 Linux启动过程 开机自检(BIOS)##硬件检查 MBR引导 GRUB菜单(选择不同的内核) 加载内核 运行init进程(Linux系统里面第一个进程) 读取/etc/inittab配置文 ...

  8. [App Store Connect帮助]三、管理 App 和版本(4)创建新版本

    当您准备分发 App 的新版本时,您创建的新版本使用您为原始版本创建的 App 记录.该新版本将对购买过先前版本的顾客免费可用. 各版本使用的 Apple ID(App 标识符).SKU 和套装 ID ...

  9. Akka源码分析-Cluster-ActorSystem

    前面几篇博客,我们依次介绍了local和remote的一些内容,其实再分析cluster就会简单很多,后面关于cluster的源码分析,能够省略的地方,就不再贴源码而是一句话带过了,如果有不理解的地方 ...

  10. zookeeper集群安装及使用详解

    1. Zookeeper简介 ZooKeeper是一个开源的分布式框架,提供了协调分布式应用的基本服务.它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronizatio ...