树并不是线性结构,因为线性结构有前驱和后继,我们可以使用线索将二叉树转换成一个类似线性的结构。什么是线索,线索其实就是将结点连在一起的指针,如果一个二叉树有n个结点,那么有n-1个指针指向它们,一共2n个指针,剩下n+1个指针没有用,利用这n+1个指针可以指向我们二叉树遍历序列中的前驱和后继。

中序线索二叉树的建立:

#include<stdio.h>
#include<stdlib.h>typedef struct TreeNode
{char ch;struct TreeNode* lchild;struct TreeNode* rchild;int ltag;int rtag;}TreeNode;TreeNode* creatTree(TreeNode** tree)
{创建二叉树char ch;ch = data[*index];*index += 1;scanf_s("%c\n", &ch);fflush(stdin);if (ch == '#'){此时为空结点*tree = NULL;}else{此时不为空结点*tree = (TreeNode*)malloc(sizeof(TreeNode));if (*tree == NULL)return NULL;(*tree)->ch = ch;(*tree)->ltag = 0;(*tree)->rtag = 0;创建左子树,逻辑一致,递归创建(*tree)->lchild = NULL;(*tree)->rchild = NULL;creatTree(&((*tree)->lchild));creatTree(&((*tree)->rchild));return *tree;}
}void Recursion(TreeNode* root)
{if (root == NULL){return;}else{printf("%c ", root->ch);Recursion(root->lchild);Recursion(root->rchild);}
}void inTreadTree(TreeNode* T, TreeNode** pre)
{if (T){inTreadTree(T->lchild,pre);do somethingif (T->lchild == NULL){T->ltag = 1;T->lchild = *pre;}if (*pre != NULL && (*pre)->rchild == NULL){(*pre)->rtag = 1;(*pre)->rchild = T;}*pre = T;inTreadTree(T->rchild, pre);}
}TreeNode* getFirst(TreeNode* T)
{while (T->ltag == 0){T = T->lchild;}return T;
}TreeNode* getNext(TreeNode* node)
{if (node->rtag == 1)return  node->rchild;elsegetFirst(node->rchild);
}int main()
{TreeNode* T;TreeNode* pre = NULL;TreeNode* ret = creatTree(&T);inTreadTree(T, &pre);pre->rtag = 1;pre->rchild = NULL;if (T == NULL){printf("T为空指针\n");return;}Recursion(T);for (TreeNode* node = getFirst(T); node != NULL; node = getNext(node)){printf("%c ", node->ch);}printf("\n");system("pause");return 0;
}

测试结果:

先序搜索二叉树:如果结点没有左右孩子,则指针指向先序遍历的前驱和后继。

#include<stdio.h>
#include<stdlib.h>typedef struct TreeNode
{char ch;struct TreeNode* lchild;struct TreeNode* rchild;int ltag;int rtag;}TreeNode;TreeNode* creatTree(TreeNode** tree)
{//创建二叉树char ch;//ch = data[*index];//*index += 1;scanf_s("%c\n", &ch);fflush(stdin);if (ch == '#'){//此时为空结点*tree = NULL;}else{//此时不为空结点*tree = (TreeNode*)malloc(sizeof(TreeNode));if (*tree == NULL)return NULL;(*tree)->ch = ch;(*tree)->ltag = 0;(*tree)->rtag = 0;//创建左子树,逻辑一致,递归创建(*tree)->lchild = NULL;(*tree)->rchild = NULL;creatTree(&((*tree)->lchild));creatTree(&((*tree)->rchild));return *tree;}
}void preTreadTree(TreeNode* T, TreeNode** pre)
{if (T){//do somethingif (T->lchild == NULL){T->ltag = 1;T->lchild = *pre;}if (*pre != NULL && (*pre)->rchild == NULL){(*pre)->rtag = 1;(*pre)->rchild = T;}*pre = T;if(T->ltag == 0)preTreadTree(T->lchild, pre);preTreadTree(T->rchild, pre);}
}TreeNode* getNext(TreeNode* node)
{if (node->rtag == 1 || node->ltag == 1){return node->rchild;}else{return  node->lchild;}
}int main()
{TreeNode* T;TreeNode* pre = NULL;TreeNode* ret = creatTree(&T);preTreadTree(T, &pre);pre->rtag = 1;pre->rchild = NULL;if (T == NULL){printf("T为空指针\n");return;}for (TreeNode* node =T; node != NULL; node = getNext(node)){printf("%c ", node->ch);}printf("\n");system("pause");return 0;
}

测试结果:

后序线索二叉树:

#include<stdio.h>
#include<stdlib.h>typedef struct TreeNode
{char ch;struct TreeNode* lchild;struct TreeNode* rchild;struct TreeNode* parent;int ltag;int rtag;}TreeNode;TreeNode* creatTree(TreeNode** tree, TreeNode* parent)
{//创建二叉树char ch;//ch = data[*index];//*index += 1;scanf_s("%c\n", &ch);fflush(stdin);if (ch == '#'){//此时为空结点*tree = NULL;}else{//此时不为空结点*tree = (TreeNode*)malloc(sizeof(TreeNode));if (*tree == NULL)return NULL;(*tree)->ch = ch;(*tree)->ltag = 0;(*tree)->rtag = 0;(*tree)->parent = parent;//创建左子树,逻辑一致,递归创建(*tree)->lchild = NULL;(*tree)->rchild = NULL;creatTree(&((*tree)->lchild),*tree);creatTree(&((*tree)->rchild),*tree);return *tree;}
}void postTreadTree(TreeNode* T, TreeNode** pre)
{if (T){//do something//if (T->ltag == 0)postTreadTree(T->lchild, pre);postTreadTree(T->rchild, pre);if (T->lchild == NULL){T->ltag = 1;T->lchild = *pre;}if (*pre != NULL && (*pre)->rchild == NULL){(*pre)->rtag = 1;(*pre)->rchild = T;}*pre = T;}
}TreeNode* getFirst(TreeNode* T)
{while (T->ltag == 0){T = T->lchild;}if (T->rtag == 0){return getFirst(T->rchild);}return T;
}TreeNode* getNext(TreeNode* node)
{if (node->rtag == 1){return node->rchild;}else{//如果是根节点if (node->parent == NULL){return NULL;}//如果是右孩子else if (node->parent->rchild == node){return node->parent;}//如果是左孩子else{if (node->parent->rtag == 0){return getFirst(node->parent->rchild);}else{return node->parent;}}}
}int main()
{TreeNode* T;TreeNode* pre = NULL;TreeNode* ret = creatTree(&T,NULL);postTreadTree(T, &pre);/* pre->rtag = 1;pre->rchild = NULL;*/for (TreeNode* node = getFirst(T); node != NULL; node = getNext(node)){printf("%c ", node->ch);}printf("\n");system("pause");return 0;
}

测试结果:

C语言实现线索二叉树—高级数据结构相关推荐

  1. C语言实现线索二叉树Threaded Binary Tree (附完整源码)

    C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...

  2. 怎样用C语言实现线索二叉树

    在实现线索二叉树时,需要在二叉树的结点中增加两个指针,分别指向前驱结点和后继结点. 下面是一个线索二叉树的结构体定义: typedef struct ThreadNode {char data;str ...

  3. C语言实现线索二叉树

    学数据结构的时候没有学线索二叉树,现在考研需要,补上了. 线索二叉树中给每个节点加上标记,使叶节点的空的数据域填上前驱或者后继,使得线索二叉树能快速的找到前驱后继. 中序线索二叉树 线索化时如节点左子 ...

  4. 数据结构源码笔记(C语言):二叉树遍历

    //二叉树遍历 #include<stdio.h> #include<malloc.h> #include<malloc.h> #define MaxSize 10 ...

  5. 【Java数据结构】线索二叉树

    中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...

  6. 深入学习二叉树(二) 线索二叉树

    深入学习二叉树(二) 线索二叉树 1 前言 在上一篇简单二叉树的学习中,初步介绍了二叉树的一些基础知识,本篇文章将重点介绍二叉树的一种变形--线索二叉树. 2 线索二叉树 2.1 产生背景 现有一棵结 ...

  7. C语言数据结构之线索二叉树

    C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...

  8. C语言 题目 1698: 数据结构-线索二叉树

    <大话数据结构>上的,大家可以参考一下  题目描述 在遍历二叉树的过程中,是按照一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树中结点的先序序列或中序序列或后序序列.但是,当以 ...

  9. 数据结构_线索二叉树(C语言)

    数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...

最新文章

  1. windows下python打开中文路径文件出现问题
  2. android键盘映射(转)-- good 1,android UI
  3. 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获
  4. 百度文本审核api_利用百度ai实现文本和图片审核
  5. OPENNMS的后台并行管理任务
  6. 深度学习笔记(6) 实践层面(一)
  7. 五菱汽车:并不知悉导致股价及成交量上升的任何原因
  8. 【Sonarqube】编程规范-Sonarqube安装与IDEA下使用
  9. 关于整合SK框架的一些个小注意
  10. HDU1881 毕业bg【0-1背包】
  11. 英文参考文献的正确引用格式详解
  12. java+MySQL 基于ssm的眼镜销售购物商城
  13. Flink 源码编译实战
  14. 电脑磁盘怎么分区以及合并?
  15. springboot 第十九节 starter and muti_datasource 多数据源
  16. 车载测试常见关心问题解答
  17. saltstack return mysql_10-saltstack 数据返回到MySQL
  18. 35岁程序员该何去何从
  19. html 当当网页面,静态网页当当网(HTML源码)
  20. 《C++新经典Linux C++通信架构实战》第1章 课程介绍

热门文章

  1. 泰克混合域示波器MDO34介绍
  2. 微信小程序picker-view自动回滚
  3. 计算机代码 w6,蓝魔w6hd的参数介绍和刷机教程详解【图解】
  4. 苹果删除照片不释放内存_恢复手机删除照片,分享给苹果玩家的生活小技巧
  5. Spring工作原理及流程
  6. 华为电脑linux指纹,华为电脑指纹锁怎么设置 以HUAWEI MateBook 13,windows 10系统为例...
  7. 2020计算机保研(北京大学信工院,南京大学计算机,计算所等)
  8. 使用anaconda安装pytorch——看这一篇就行了
  9. 计算机一级office选择题必背知识点,全国计算机等级考试MSOffice选择题必考.docx...
  10. PHP如何实现字符串反转_php反转字符串方法