线索二叉树的学习

线索二叉树的介绍

 线索二叉树是由二叉树的基础上进行了改良,改良后比起二叉树增加了线索 ,使得遍历二叉树时不用回溯直接到下一节点。 

一、线索二叉树的优缺点

优点:

可以快速的遍历二叉树,不需要回溯,所以可以节约很多空间和时间。

可以方便的找到二叉树的前驱和后继节点,不需要遍历整个二叉树。

线索二叉树可以用于解决一些特定的问题,如寻找二叉树中的的某个节点。

缺点:

线索二叉树树的构建比起二叉树更复杂,需要额外的空间来存储线索。

删除和插入操作比较麻烦,要操作完后更新线索。

所以线索二叉树比较合适遍历比起二叉树,可能其他操作可能还不如二叉树。

总得来说,线索二叉树在遍历二叉树上有一定的优势,但是在其他的方面可能还不如普通二叉树。

所以在使用二叉树时需要根据具体情况来选择是否使用。如果要经常遍历二叉树,可以使用线索二叉树。如果经常进行插入删除操作可以使用普通二叉树。

二、线索二叉树的基本概念和实现

遍历二叉树是以一定的规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列,中序序列或后序序列。这实质上是对一个非线性结构进行线性化操作,使每个结点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后驱(在不至于混淆和情况,后续 描述中省去“直接”二字)。

                                                                                                  --------------------数据结构课本

线索二叉树实现具体描述

线索二叉树是一种特殊的二叉树,所以先要构建一个二叉树,然后在二叉树的基础上增加线索,使得遍历二叉树时不用进行回溯,直接转到下一个结点。线索二叉树包括前序线索二叉树,中序线索二叉树和后序线索二叉树,它们实现的方式有点点区别。

以下是线索二叉树的实现描述:

定义线索二叉树的结点结构体,包含了结点的值,左右指针和线索标志。线索标志用于标记结点的左右指针是指向子节点还是前驱或后继结点。

结构体代码如下:

typedef struct BiThrNode
{
	TElemType data;
	struct BiThrNode *lchild,*rchild;//左右孩子指针
	int LTag,RTag;//左右标志
}BiThrNode,*BiThrTree;
 

定义一个全局变量,用于保存中序遍历的前驱结点

BiThrTree pre;

构建二叉树

void createtree(BiThrTree t)
{
	char c;
    scanf("%c",&c);
    getchar();
	if(c=='#')//二叉树以#号结束 
	t=NULL;
	else 
	{
		t=(BiThrNode *)malloc(sizeof(BiThrNode));//构建结点空间 
		t->data=c;           //给结点赋值 
		createtree(t->lchild);//建立左结点 
		createtree(t->rchild);//建立右结点  
	}
}

然后定义一个函数,用来构造线索二叉树

void createTree(BiThrTree p)
{
	if(p){
		createTree(p->lchild); //左子树递归线索化 
		if(!p->lchild){        //p的左孩子为空 
			p->LTag=1;         //给p加上左线索 
			p->lchild=pre;     //p的左孩子指针指向pre(前驱) 
		}
		else p->LTag=0;        
		if(!pre->rchild){      //pre的右孩子为空     
			pre->RTag=1;       //给pre加上右线索 
			pre->rchild=p;     //pre的右孩子指针指向p(后继) 
		}
		else pre->RTag=0;
		pre=p;                 //pre指向前驱结点 
		createTree(p->rchild); //右子树递归线索化 
	}
}

遍历线索二叉树

void InOrderTraverse(BiThrTree t) 
{
	BiThrTree p;
	p=t->lchild;           //p指向根节点 
	while(p!=t){           //空树遍历结束时,p==t 
		while(p->LTag==0)  //沿着左孩子一直向下 
		p=p->lchild;       
		printf("%c",p->data); //访问左子树为空的结点 
		while(p->RTag==1&&p->rchild!=t){//沿着右线索遍历  
			p=p->rchild;                
			printf("%c",p->data);
		}
		p=p->rchild;                    //转到右子树 
	}
}

以上是线索二叉树的主要步骤

三、综合代码

#include<stdio.h>
#include<stdlib.h>
#define TElemType char
typedef struct BiThrNode
{
	TElemType data;
	struct BiThrNode *lchild,*rchild;
	int LTag,RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre;
void createtree(BiThrTree t)
{
	char c;
	scanf("%c",&c);
	getchar();
	if(c=='#')//二叉树以#号结束 
	t=NULL;
	else 
	{
		t=(BiThrNode *)malloc(sizeof(BiThrNode));//构建结点空间 
		t->data=c;           //给结点赋值 
		createtree(t->lchild);//建立左结点 
		createtree(t->rchild);//建立右结点  
	}
}
void createTree(BiThrTree p)
{
	if(p){
		createTree(p->lchild); //左子树递归线索化 
		if(!p->lchild){        //p的左孩子为空 
			p->LTag=1;         //给p加上左线索 
			p->lchild=pre;     //p的左孩子指针指向pre(前驱) 
		}
		else p->LTag=0;        
		if(!pre->rchild){      //pre的右孩子为空     
			pre->RTag=1;       //给pre加上右线索 
			pre->rchild=p;     //pre的右孩子指针指向p(后继) 
		}
		else pre->RTag=0;
		pre=p;                 //pre指向前驱结点 
		createTree(p->rchild); //右子树递归线索化 
	}
}
void InOrderTraverse(BiThrTree t) 
{
	BiThrTree p;
	p=t->lchild;           //p指向根节点 
	while(p!=t){           //空树遍历结束时,p==t 
		while(p->LTag==0)  //沿着左孩子一直向下 
		p=p->lchild;       
		printf("%c",p->data); //访问左子树为空的结点 
		while(p->RTag==1&&p->rchild!=t){//沿着右线索遍历  
			p=p->rchild;                
			printf("%c",p->data);
		}
		p=p->rchild;                    //转到右子树 
	}
}
int main()
{
	BiThrNode t;
	createtree(&t);
	createTree(&t);
	InOrderTraverse(&t);
 } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
创建线索叉树是一种对二叉树进行优化的数据结构。它的目的是为了加快二叉树的遍历速度。在传统的二叉树中,为了实现对二叉树的遍历,需要使用递归或者栈来实现。而线索叉树通过添加线索,将二叉树的节点之间的遍历顺序进行编码,从而实现快速遍历。 在线索叉树中,每个节点都有两个指针:左指针和右指针。在一棵二叉树中,如果一个节点没有左孩子,则将其左指针指向该节点的前驱节点。如果一个节点没有右孩子,则将其右指针指向该节点的后继节点。通过这样的线索指针,可以快速地找到一个节点的前驱和后继节点,进而实现对二叉树的快速遍历。 具体来说,在线索叉树中,如果一个节点没有左孩子,则将其左指针指向其前驱节点;如果一个节点没有右孩子,则将其右指针指向其后继节点。通过这样的线索化过程,原本需要递归或者栈来实现的遍历过程,可以直接通过线索指针快速找到下一个需要遍历的节点,从而提高了遍历的效率。 总的来说,线索叉树是一种优化的二叉树结构,通过添加线索指针,将二叉树的节点之间的遍历顺序进行编码,从而实现了对二叉树的快速遍历。它的设计思想主要是通过设置节点的线索指针指向前驱和后继节点,提高了遍历效率,减少了递归或栈的使用。这是一个在实际应用中常用的数据结构,可以广泛应用于二叉树遍历的场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值