C语言实现线索二叉树—高级数据结构
树并不是线性结构,因为线性结构有前驱和后继,我们可以使用线索将二叉树转换成一个类似线性的结构。什么是线索,线索其实就是将结点连在一起的指针,如果一个二叉树有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语言实现线索二叉树—高级数据结构相关推荐
- C语言实现线索二叉树Threaded Binary Tree (附完整源码)
C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...
- 怎样用C语言实现线索二叉树
在实现线索二叉树时,需要在二叉树的结点中增加两个指针,分别指向前驱结点和后继结点. 下面是一个线索二叉树的结构体定义: typedef struct ThreadNode {char data;str ...
- C语言实现线索二叉树
学数据结构的时候没有学线索二叉树,现在考研需要,补上了. 线索二叉树中给每个节点加上标记,使叶节点的空的数据域填上前驱或者后继,使得线索二叉树能快速的找到前驱后继. 中序线索二叉树 线索化时如节点左子 ...
- 数据结构源码笔记(C语言):二叉树遍历
//二叉树遍历 #include<stdio.h> #include<malloc.h> #include<malloc.h> #define MaxSize 10 ...
- 【Java数据结构】线索二叉树
中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...
- 深入学习二叉树(二) 线索二叉树
深入学习二叉树(二) 线索二叉树 1 前言 在上一篇简单二叉树的学习中,初步介绍了二叉树的一些基础知识,本篇文章将重点介绍二叉树的一种变形--线索二叉树. 2 线索二叉树 2.1 产生背景 现有一棵结 ...
- C语言数据结构之线索二叉树
C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...
- C语言 题目 1698: 数据结构-线索二叉树
<大话数据结构>上的,大家可以参考一下 题目描述 在遍历二叉树的过程中,是按照一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树中结点的先序序列或中序序列或后序序列.但是,当以 ...
- 数据结构_线索二叉树(C语言)
数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...
最新文章
- windows下python打开中文路径文件出现问题
- android键盘映射(转)-- good 1,android UI
- 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获
- 百度文本审核api_利用百度ai实现文本和图片审核
- OPENNMS的后台并行管理任务
- 深度学习笔记(6) 实践层面(一)
- 五菱汽车:并不知悉导致股价及成交量上升的任何原因
- 【Sonarqube】编程规范-Sonarqube安装与IDEA下使用
- 关于整合SK框架的一些个小注意
- HDU1881 毕业bg【0-1背包】
- 英文参考文献的正确引用格式详解
- java+MySQL 基于ssm的眼镜销售购物商城
- Flink 源码编译实战
- 电脑磁盘怎么分区以及合并?
- springboot 第十九节 starter and muti_datasource 多数据源
- 车载测试常见关心问题解答
- saltstack return mysql_10-saltstack 数据返回到MySQL
- 35岁程序员该何去何从
- html 当当网页面,静态网页当当网(HTML源码)
- 《C++新经典Linux C++通信架构实战》第1章 课程介绍
热门文章
- 泰克混合域示波器MDO34介绍
- 微信小程序picker-view自动回滚
- 计算机代码 w6,蓝魔w6hd的参数介绍和刷机教程详解【图解】
- 苹果删除照片不释放内存_恢复手机删除照片,分享给苹果玩家的生活小技巧
- Spring工作原理及流程
- 华为电脑linux指纹,华为电脑指纹锁怎么设置 以HUAWEI MateBook 13,windows 10系统为例...
- 2020计算机保研(北京大学信工院,南京大学计算机,计算所等)
- 使用anaconda安装pytorch——看这一篇就行了
- 计算机一级office选择题必背知识点,全国计算机等级考试MSOffice选择题必考.docx...
- PHP如何实现字符串反转_php反转字符串方法