在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

文章目录

  • 一、c语言实现先序线索、中序线索、后续线索二叉树
  • 总结

一、c语言实现先序线索、中序线索、后续线索二叉树

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {int data;BiTNode* lchild, * rchild;int ltag=0, rtag=0;
}BiTNode,*BiTree;BiTree pre = NULL;//全局变量void visit(BiTree P) {if (P->lchild == NULL) {P->lchild = pre;P->ltag=1;}if (pre != NULL && pre->rchild == NULL) {pre->rchild = P;pre->rtag = 1;}if(P!=NULL) printf("%d\n", P->data);if (P == NULL) printf("no rchild");pre = P;
}//中序线索二叉树,一边遍历一边线索化
void MBuild(BiTree P) {if(P!=NULL){MBuild(P->lchild);visit(P);MBuild(P->rchild);}
}//中序线索树节点p的前驱节点
BiTree MPreNode(BiTree p) {if (p->ltag == 1) p = p->lchild;else {if (p->ltag != 1) {p = p->lchild;while (p->rtag != 1 && p->rchild != NULL)//注意p->rtag != 1 && p->rchild != NULL而不是p->rchild != NULLp = p->rchild;}}return p;
}//中序线索树节点p的后继节点
BiTree MSucceedNode(BiTree p) {if (p->rtag == 1) {p = p->rchild; }else {if (p->rtag ==0) {p = p->rchild;while (p->ltag != 1 && p->lchild != NULL)//注意p = p->lchild;}}return p;
}//先序线索树,一边遍历一边线索化
void PBuild(BiTree T) {if (T != NULL) {visit(T);if(T->ltag!=1) PBuild(T->lchild);PBuild(T->rchild);}}//先序线索树节点p的前驱节点   注意else!!!!!!!!!!!!!
BiTree PPreNode(BiTree p) {if (p->ltag == 1) p = p->lchild;else {if (p->ltag != 1) {printf("can not by this way!");}}return p;
}//先序线索树节点p的后继节点     注意else!!!!!!!!!!!!
BiTree PSucceedNode(BiTree p)  {if (p->rtag == 1) p = p->rchild;else {if (p->rtag != 1) {if (p->ltag!=1)  p=p->lchild;elseif (p->ltag==1) p = p->rchild;}}return p;
}//后序线索二叉树,一边遍历一边线索化
void LBuild(BiTree P) {if (P != NULL) {MBuild(P->lchild);MBuild(P->rchild);visit(P);}
}//后序线索树节点p的前驱节点
BiTree LPreNode(BiTree p){if (p->ltag == 1) p = p->lchild;else {if (p->ltag != 1) {if (p->rtag!=1) p = p->rchild;if (p->rtag==1) p = p->lchild;}}return p;
}//后序线索树节点p的后继节点
BiTree LSucceedNode(BiTree p) {if (p->rtag == 1) p = p->rchild;else {if (p->rtag != 1) {printf("can not by this way!");}}return p;
}int main() {BiTree a1 = (BiTree)malloc(sizeof(BiTNode));a1->data = { 1 };a1->ltag = 0;a1->rtag = 0;a1->lchild = NULL;a1->rchild = NULL;BiTree a2 = (BiTree)malloc(sizeof(BiTNode));a2->data = { 2 };a1->lchild = a2;a2->ltag = 0;a2->rtag = 0;a2->lchild = NULL;a2->rchild = NULL;BiTree a3 = (BiTree)malloc(sizeof(BiTNode));a3->data = { 3 };a1->rchild = a3;a3->lchild = NULL;a3->rchild = NULL;a3->ltag = 0;a3->rtag = 0;BiTree a5 = (BiTree)malloc(sizeof(BiTNode));a5->data = { 5 };a2->rchild = a5;a5->lchild = NULL;a5->rchild = NULL;a5->ltag = 0;a5->rtag = 0;BiTree a6 = (BiTree)malloc(sizeof(BiTNode));a6->data = { 6 };a3->lchild = a6;a6->lchild = NULL;a6->rchild = NULL;a6->ltag = 0;a6->rtag = 0;BiTree a7 = (BiTree)malloc(sizeof(BiTNode));a7->data = { 7 };a3->rchild = a7;a7->lchild = NULL;a7->rchild = NULL;a7->ltag = 0;a7->rtag = 0;//中序的测试
//  MBuild(a1);
//  pre->rchild = NULL;
//  BiTree n = MPreNode(a3);
//  BiTree m = MSucceedNode(a2);
//  printf(" %d\n",n->data);//先序的测试PBuild(a1);pre->rchild = NULL;printf("%d\n",PPreNode(a3)->data);printf("%d\n",PSucceedNode(a3)->data);//后序的测试
//  LBuild(a1);
//  pre->rchild = NULL;
//  printf("  %d\n", LPreNode(a5)->data);
//  printf("  %d\n", LSucceedNode(a6)->data);}

总结

关注一下吧!好想有几个粉丝啊

线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树相关推荐

  1. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  2. c语言顺序存储构建一棵二叉树,C语言 数据结构堆排序顺序存储(升序)

    堆排序顺序存储(升序) 一: 完全二叉树的概念:前h-1层为满二叉树,最后一层连续缺失右结点! 二:首先堆是一棵全完二叉树: a:构建一个堆分为两步:⑴创建一棵完全二叉树      ⑵调整为一个堆 ( ...

  3. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  4. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  5. C语言实现线索化二叉树(先序、中序、后序)

    >>如何用C语言构建一颗二叉树? 第一种方法: ThreadTree A = (ThreadTree)malloc(sizeof(ThreadNode));A->data = { ' ...

  6. 线索二叉树(前中后序线索化/遍历/画线索)

    线索二叉树 文章目录 线索二叉树 1 线索二叉树的基本概念 2 线索二叉树的构造 2.1 线索二叉树的存储结构 2.2 给线索二叉树画线索 2.2.1 中序 2.2.2 先序 2.2.3 后序 2.3 ...

  7. C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历)

    C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历) tips:前些天学习了C语言数据结构链表,栈,队列.今天来学习一下C语言数据结构之二叉树的各种操作. 注意:二叉树的层次建树是 ...

  8. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  9. 数据结构笔记 —— 二叉树(前序、中序、后序遍历和查找)

    本篇博客是根据b站尚硅谷的数据结构教程,学习后写的学习笔记,本篇博客的重点在自己编写的代码注释和过程分析上 https://www.bilibili.com/video/BV1E4411H73v?p= ...

最新文章

  1. 【hdu5285】wyh2000 and pupil
  2. ADSL提速 从入门到精通
  3. [转]CISCO IOS命名规则
  4. VS2005 sp1安装体会
  5. Oracle异常汇总
  6. 字符串长度的求解 (3种方法)
  7. Android 蓝牙开发(五)OPP接收文件
  8. Python 之 pip安装 及 使用详解
  9. Zigbee 2006介绍+资料+源代码下载
  10. 详解Java 堆排序
  11. c# 模拟串口通信 SerialPort
  12. python知识图谱智能问答_机器人之基于知识图谱的智能问答机器人
  13. android用出生日期显示星座代码,根据出生日期自动取得星座的js代码
  14. 我眼中的嵌入式是这样的!
  15. 投资银行业务过关必做1500题
  16. keil编译出现错误Undefined symbol __aeabi_assert,解决办法
  17. 通孔焊盘命名规范-002
  18. 对于服务治理概念的一些总结和理解,我们应该如何实践服务治理
  19. c语言arctan转换求pi,arctanx可以转换成什么
  20. 世界观和方法论——青山行客

热门文章

  1. win10系统下 笔记本快捷键使用
  2. 徐州文广旅行业安全监管平台入围2020年度江苏省智慧文旅培育项目
  3. pydicom读取头文件_python读取dicom图像(SimpleITK和dicom包实现)_愿十四亿神州尽舜尧-CSDN博客_python读取dicom...
  4. mysql的replace用法
  5. Cross-Origin Read Blocking (CORB)
  6. axios同步请求--
  7. 【Java基础】接口和抽象类有什么共同点和区别?
  8. win10以太网dns服务器未响应,win10系统dns服务器未响应的解决方法
  9. unity3d学习笔记(十一)-NGUI结合Shader制作小map
  10. estimator使用