#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. TensorFlow 官方文档中文版

    http://wiki.jikexueyuan.com/list/deep-learning/ TensorFlow 官方文档中文版 你正在阅读的项目可能会比 Android 系统更加深远地影响着世界 ...

  2. 基于webrtc的媒体库測试代码以及接口介绍

    经过一段时间的项目验证,第一版接口能够定版了.满足一般的项目需求是没有问题了,接口非常清晰,凝视也写的非常清晰,大家有须要的就拿去測试吧,android版本号还在验证中.假设有什么问题或者须要源码.能 ...

  3. oc85--利用宏定义简化单例

    //Singleton.h // 以后就可以使用interfaceSingleton来替代后面的方法声明. \表示下一行也是上一行的内容. #define interfaceSingleton(nam ...

  4. Timer A UP mode 中断

    Timer_A, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK //  Description: Toggle P1.0 using software and TA ...

  5. hibernate基础简单入门1---helloword

    1:目录结果 2:实体类(student.java) package com.www.entity; public class Student { private int id; private St ...

  6. php的session

    来源:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/ http协议是WEB服务器与客户 端(浏览器)相互通信的协议,它 ...

  7. 题目收藏夹(啥时候一遍A啥时候删)

    以下题目为没有思路或代码离谱错误或看了题解才会的,间隔一周以上再做一遍A掉就删. bzoj1500 bzoj2287 codevs1358 bzoj1725

  8. JS判断数组是否包含某元素

    我在学习ES6数组拓展时,发现了新增了不少了有趣的数组方法,突然想好工作中判断数组是否包含某个元素是非常常见的操作,那么这篇文章顺便做个整理. 1.for循环结合break 可能很多人第一会想到for ...

  9. 慕课网6-2 作业:js实现轮播特效

    小伙伴们,掌握了JavaScript的语法.流程控制语句.内置对象以及DOM和BOM的知识,运用所学知识完成如下图所示的交互效果——轮播图.效果图如下: 具体交互效果图参考gif动态效果图,gif效果 ...

  10. 【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)

    题目: 洛谷2982 分析: 这道题最重要的是想明白一点:牛\(i\)走到以后只对\(P_i\)的子树产生影响 知道这个以后,就可以想到在线维护每个牧场已经被"影响"了多少次(也就 ...