数据结构(十三) 线索二叉树讲解(不带头节点前序加线索) 以及实现的完整代码

原创 2017年01月01日 21:10:01

引用线索二叉树的目的

因为二叉链表中,假设有n个节点,指针指向为空的指针有n+1个,为了利用这些指针,引入了线索化的概念,而且为二叉链表加入线索化后,对二叉树的遍历便的很方便。

加线索化分为:前序线索化,中序线索化,后序线索化。

如果不理解,请参考这个博客,写的非常详细:http://blog.csdn.net/my_heart_/article/details/52086321

实现的代码如下:

//为二叉链表加前序线索化 (不带头节点)
#include <iostream>

using namespace std;
//线索化的结构体 
typedef struct Node
{
	char data;
	int ltag;
	int rtag;
	struct Node *lchild;
	struct Node *rchild;		
}*BiTree;
//pre为前驱节点。为全局变量 ,初始化时右子树为空 
BiTree pre;
//前序实现创建二叉树 
void createBiTree(BiTree &Tree)
{
	char data;
	cin>>data;
	if(data=='#')
	{
		Tree = NULL;
	}
	else
	{
		Tree = new Node();
		Tree->data = data;
	//	Tree->ltag = 0;
	//	Tree->rtag=0;
		createBiTree(Tree->lchild);
		createBiTree(Tree->rchild);	
	}
}
//前序线索化的实现
void function(BiTree &Tree,BiTree &pre)
{
	if(Tree)
	{
		if(Tree->lchild==NULL)
		{
			Tree->ltag=1;
			Tree->lchild=pre;
		}
		else
		{
			Tree->ltag=0;
		}
		if(pre->rchild==NULL)
		{
			pre->rtag=1;
			pre->rchild=Tree;
		}
		else
		{
			Tree->rtag=0;
		}
		pre = Tree;	
		if(Tree->ltag==0)
		{
			function(Tree->lchild,pre);
		}
		if(Tree->rtag==0)
		{
			function(Tree->rchild,pre);
		}
		
	}
}
//前序遍历  根左右 
void preBiTree(BiTree Tree)
{
	if(Tree==NULL)
	{
		cout<<"是空数\n";
		exit(1);
	}
	while(Tree!=NULL)
	{
		while(Tree->lchild!=NULL&&Tree->ltag==0)
		{
			cout<<Tree->data<<" ";
			Tree = Tree->lchild;
		}
		cout<<Tree->data<<" ";
		if(Tree->ltag==1)
		{
			Tree = Tree->rchild;
		}	
		while(Tree!=NULL)
		{
			if(Tree->lchild!=NULL&&Tree->ltag==0)
			{
				break;
			}
			cout<<Tree->data<<" ";
			Tree = Tree->rchild;
		}		
	}
} 

int main()
{
	BiTree Tree;
	cout<<"请输入你要创建的二叉树的数据(按先序遍历创建的二叉树#为空节点的表示)\n";
	createBiTree(Tree);
	pre = new Node();
	pre->lchild=NULL; 
	function(Tree,pre);
	preBiTree(Tree);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

线索二叉树的完整代码实现

线索二叉树的完整代码,可直接运行 代码如下://线索二叉树 #include #includetypedef char TElemType;typedef enum {Link,Thread} Po...
  • fengyanglian
  • fengyanglian
  • 2015年11月02日 11:24
  • 1804

数据结构 线索二叉树 原理及实现

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。   ...
  • AXuan_K
  • AXuan_K
  • 2014年11月16日 15:58
  • 1473

线索二叉树原理及前序、中序线索化(Java版)

一、线索二叉树原理      前面介绍二叉树原理及特殊二叉树文章中提到,二叉树可以使用两种存储结构:顺序存储和二叉链表。在使用二叉链表的存储结构的过程中,会存在大量的空指针域,为了充分利用这些空指针域...
  • UncleMing5371
  • UncleMing5371
  • 2017年01月07日 17:02
  • 2897

数据结构(14)--线索二叉树的实现

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.什么是线索二叉树...
  • u010366748
  • u010366748
  • 2016年03月01日 10:56
  • 2073

数据结构(十四) 线索二叉树讲解(不带头节点中序加线索) 以及实现的完整代码

中序线索话何上一篇博客的前序加线索化思路是一样的。 下面是实现的代码: //为二叉链表加中序线索化 (不带头节点) #include using namespace std; //线索化的结构...
  • liuxuefeng12
  • liuxuefeng12
  • 2017年01月02日 14:45
  • 127

数据结构之线索二叉树的前序,中序和后序遍历

BinaryTree线索化二叉树      二叉树是一种非线性结构,在之前实现的二叉树遍历中不管是递归还是非递归用二叉树作为存储结构时只能取到该结点的左孩子和右孩子,不能得到该结点的前驱和后继。为了保...
  • qq_34328833
  • qq_34328833
  • 2016年10月09日 19:24
  • 4540

数据结构-------------线索二叉树(c语言)

一、线索二叉树        如果二叉树的节点包含数据域和两个指针域( lchild 和 rchild ),当节点没有下一个节点时,将指针域赋值为空(NULL),但有时会造成很大的浪费,所以可以将空...
  • u011459278
  • u011459278
  • 2014年03月20日 21:35
  • 5905

数据结构(十五) 线索二叉树讲解(带头节点中序加线索) 以及实现的完整代码

这篇博客主要讲解的是中序线索化的基础上加上头节点(前序类似),这样做的好处是可以让所有的指针都不为空(即都有指向)。 下篇博客主要讲解后序加上线索化,这个有一定的难度。 实现的代码如下:...
  • liuxuefeng12
  • liuxuefeng12
  • 2017年01月02日 14:55
  • 259

数据结构(十六) 线索二叉树讲解(带头节点后序加线索) 以及实现的完整代码

这篇先放放,等等再写。
  • liuxuefeng12
  • liuxuefeng12
  • 2017年01月02日 18:36
  • 92

线索化二叉树C++

线索化二叉树 1.创建二叉树 2.先序递归遍历输出二叉树 3.线索化二叉树 4.输出线索化二叉树...
  • J_Anson
  • J_Anson
  • 2015年11月19日 10:15
  • 766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(十三) 线索二叉树讲解(不带头节点前序加线索) 以及实现的完整代码
举报原因:
原因补充:

(最多只允许输入30个字)