C语言 线索二叉树

news/2025/2/22 18:52:15

线索二叉树,我个人的理解是:在创建一个二叉树的基础上,把二叉树中的只有一个孩子或没有孩子的结点中的指向空的指针进行填充,以便于二叉树的遍历。
首先,还是先创建一个二叉树
在这里插入图片描述
还是以上个代码中所表示的样板为例(懒)。画不怎么好看,请见谅!
然后,便是对已经建立的二叉树进行线索化。
在这里插入图片描述
上图是对头结点Thrt的初始化,结点pre为全局变量。
另外需要记住:
(1)LTag为0时指向该结点的左孩子,为1时指向该结点的前驱;
(2)RTag为0时指向该结点的右孩子,为1时指向该结点的后继。
二叉树的线索化:
在这里插入图片描述
前:直接前驱;后:直接后继。(图不好看请见谅!)
最后,利用线索遍历二叉树

代码运行的结果展示图为:
在这里插入图片描述
第一行为输入的(二叉树)数据。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BiThrNode
{
	char data;//结点的数据域 
	struct BiThrNode *lchild,*rchild;//左右孩子指针
	int LTag,RTag;//左右标志 
}BiThrNode,*BiThrTree;

void CreateTree(BiThrTree &T)//创建二叉树,这里是先序遍历的顺序建立的二叉链表  递归形式 
{
	char ch;
	scanf("%c",&ch);//输入链表数据 
	if(ch == '#')//如果出现输入的是#,终止递归。终止递归条件
		T = NULL;
	else
	{
		T = (BiThrNode*)malloc(sizeof(BiThrNode));//申请一个根结点 
		T->data = ch;//对根结点进行赋值 
		CreateTree(T->lchild);//递归创建左子树 
		CreateTree(T->rchild);//递归创建右子树
	}
}

BiThrTree pre;//定义全局变量pre 

void InThreading(BiThrTree p)//对二叉树p进行线索化 
{
	if(p)//递归终止条件 
	{
		InThreading(p->lchild);//左子树递归线索化 
		if(p->lchild == NULL)//p的左孩子为空 
		{
			p->LTag = 1;//给p加上左线索 
			p->lchild = pre;//p的左孩子指针指向pre(前驱) 
		}
		else
			p->LTag = 0;
		if(pre->rchild == NULL)//pre的右孩子为空 
		{
			pre->RTag = 1;//给pre加上右线索 
			pre->rchild = p;//pre的右孩子指针指向p(后继) 
		}
		else
			p->RTag = 0;
		pre = p;//保持pre指向p的前驱 
		InThreading(p->rchild);//右子树的递归线索化 
	}
} 

void InOrerThreading(BiThrTree &Thrt,BiThrTree T)//创建一个头结点Thrt,并使其连入p的线索化中 
{
	Thrt = (BiThrNode*)malloc(sizeof(BiThrNode));//创建一个头结点 
	Thrt->LTag = 0;
	Thrt->RTag = 1;
	Thrt->rchild = Thrt;//初始化头结点 ,头结点的右指针指向自己 
	if(T == NULL)//如果二叉树为空,则头结点的左指针指向自己 
		Thrt->lchild = Thrt; 
	else
	{
		Thrt->lchild = T;//头结点的左孩子指向根 
		pre = Thrt;//pre初值指向头结点
		InThreading(T);//调用上面的线索化函数 
		pre->rchild = Thrt;//pre为最右结点,pre的右线索指向头结点
		pre->RTag = 1;
		Thrt->rchild = pre;//头结点的右线索指向pre 
	}
}

void InOrderTraverse_Thr(BiThrTree Thrt)//遍历并打印线索二叉树 
{
	BiThrTree p;//创建一个指针 
	p = Thrt->lchild;//p指向根结点 
	while(p != Thrt)//空树或遍历结束时,p==T; 
	{
		while(p->LTag == 0)//沿左孩子向下 
			p = p->lchild;
		printf("%d %c %d\n",p->LTag,p->data,p->RTag);//打印p结点,及左右标志 
		while(p->RTag == 1&&p->rchild != Thrt)//沿右线索访问后继结点 
		{
			p = p->rchild;
			printf("%d %c %d\n",p->LTag,p->data,p->RTag);
		}
		p = p->rchild;//转向p的右子树 
	}
}

int main()
{
	BiThrTree Thrt,T;//定义个头结点,和二叉树T 
	CreateTree(T);//创建二叉树T 
	InOrerThreading(Thrt,T);//线索化二叉树T 
	InOrderTraverse_Thr(Thrt);//打印线索二叉树 
	return 0;
}

(完)


http://www.niftyadmin.cn/n/1580201.html

相关文章

jbpm5.1介绍(5)

看几个jbpm5中带的示例程序吧&#xff0c;包括了很多我们在日常生活中的场景 循环示例 本示例是一个在外部传入的变量&#xff0c;通过传入的变量来判断循环次数的演示程序&#xff0c;看一下流程定义的内容 如图&#xff1a; 初始化的时候设置变量i的值为0&#xff0c;然后进入…

二叉排序树-非递归形式 C语言

完整代码如下&#xff1a; #include <stdio.h> #include <stdlib.h>typedef struct BiTNode {int data;//二叉树数据域 struct BiTNode *lchild,*rchild;//二叉树指针域 }BiTNode,*BiTree;void InitTree(BiTree &T)//初始化二叉树 {T (BiTNode*)malloc(siz…

C语言 哈夫曼树的实现及 递归实现哈夫曼编码

构建哈夫曼树算法的实现可以分为两大部分。 &#xff08;1&#xff09;初始化&#xff1a;首先动态申请2n个单元&#xff1b;然后循环2n-1次&#xff0c;从1号单元开始&#xff0c;依次将1至2n-1所有单元中的双亲、左孩子、右孩子的下标都初始化为0&#xff1b;最后再循环n次&…

HMAC MD5 http://hmacmd5.codeplex.com HMAC-MD5 for .NET 4.0, SL4 and WP7 Silverlight Windows Phone

转载于:https://www.cnblogs.com/Microshaoft/archive/2011/11/11/2245184.html

C语言 中序遍历二叉树--非递归算法

完整代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct BiTNode//二叉树的结构体 {char ch;//二叉树的数据域 struct BiTNode *lchild,*rchild;//二叉树的指针域 }BiTNode ,*BiTree;typedef struct StackN…

Android JNI入门第三篇——jni头文件分析

一、 首先写了java文件&#xff1a; public class HeaderFile { private native void doVoid(); native int doShort(); native void doArray(Object[] o ); native int doInt(int i); //byte ,short ,int,long,float,double ,boolean,char …

矩阵的对称性,自反性和反对称性的判断

用C语言实现离散数学中对矩阵的简单操作及对矩阵的判断 判断是否输入的矩阵是否为方阵&#xff0c;在是方阵的基础上判断是否具有对称性&#xff0c;反对称性和自反性。 对称矩阵&#xff1a;一个方形矩阵&#xff0c;其转置矩阵和自身相等。 对称矩阵是指以主对角线为对称轴…

集中管理:领导者,不能不考虑的几件事之——“挖”出来的无限可能

原文链接&#xff1a;http://www.betasoft.com.cn/laosun/2011-11-14/2054.html 我们都知道&#xff0c;分布式部署管理模式有很多集中管理所无法比拟的优势&#xff0c;但也有其自身所无可避免的缺陷。随着网络基础设施规模和业务规模的扩大&#xff0c;IT运维数据信息的管理和…