`
北极的。鱼
  • 浏览: 158952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】线索二叉树创建,遍历

 
阅读更多

转自: http://blog.csdn.net/cheneagle/article/details/4397750

 

     线索二叉树利用末节点的空指针将其他节点连接起来,达到整个树枝顺序和逆序都能遍历的作用。因为任何一棵n节点的二叉树,它总有n+1个空的指针。比如1个节点二叉树,那么就有2个左右孩子为空指针,同理以此类推。这样就充分利用空间而达到快速遍历的作用。详细请看源代码:

    为了以后快速查找,我还是简单说下怎么输入数据,如下图所示的数据结构:

 

二叉树输入示列

像这样的数据结构我们怎么输入呢?

第一次输入ab#,然后回车。

第二次输入c##,然后回车。

第三次输入d#,然后回车。

第四次输入g##,然后回车。

不知道以后的我或者网友是否看明白呢?希望以后的我和大家领悟能力比我现在这些苍白的文字强n的XX次方!

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

typedef char DataType;

typedef struct _ThreadBiTreeNode
{
	DataType data;
	int ltag, rtag;
	struct _ThreadBiTreeNode *right, *left;
}ThreadBiTreeNode, *ThreadBiTree;

/**
  *  先序方式创建线索二叉树
  *  请用以下方式输入ab#,然后回车;c##,然后回车;
  *  d#,然后回车;g##,然后回车。
  */
ThreadBiTree CreateTree( )
{
	ThreadBiTree t;
	DataType ch;
	cin >> ch;
	if( ch == '#' )
		t = NULL;
	else
	{
		t = ( ThreadBiTree )malloc( sizeof( ThreadBiTreeNode ) );
		if( t )
		{
			t->data = ch;
			t->ltag = t->rtag = 0;
			t->left = CreateTree();
			t->right = CreateTree();
		}
	}
	return t;
}

/**
  *  先序线索二叉树,将空的指针指向一个连接
  *  这里要申请一个全局变量g_pre
  *
  */
ThreadBiTree g_pre;

void PreThreadTree( ThreadBiTree t )
{
	if( t == NULL )
		return;
	
	if( t->left == NULL )
		t->ltag = 1;
	if( t->right == NULL )
		t->rtag = 1;

	if( g_pre != NULL && t->ltag == 1 )
		t->left = g_pre;
	if( g_pre != NULL && g_pre->rtag == 1  )
		g_pre->right = t;
	g_pre = t;

	if( t->ltag == 0 )
		PreThreadTree( t->left );
	if( t->rtag == 0 )
		PreThreadTree( t->right );
}

/**
  *  中序线索二叉树
  * 
  *
  */
void InThreadTree( ThreadBiTree t )
{
	if( t == NULL )
		return;

	InThreadTree( t->left );
	if( t->left == NULL )
		t->ltag = 1;
	if( t->right == NULL )
		t->rtag = 1;

	if( g_pre != NULL && t->ltag == 1 )
		t->left = g_pre;
	if( g_pre != NULL && g_pre->rtag == 1  )
		g_pre->right = t;
	g_pre = t;

	if( t->rtag == 0 )
		InThreadTree( t->right );
}

/**
  *  后序线索二叉树
  * 
  *
  */
void PostThreadTree( ThreadBiTree t )
{
	if( t == NULL )
		return;

	PostThreadTree( t->left );
	PostThreadTree( t->right );

	if( t->left == NULL )
		t->ltag = 1;
	if( t->right == NULL )
		t->rtag = 1;

	if( g_pre != NULL && t->ltag == 1 )
		t->left = g_pre;
	if( g_pre != NULL && g_pre->rtag == 1  )
		g_pre->right = t;
	g_pre = t;
}

/**
  *  寻找当前节点的后节点
  *  
  *
  */
ThreadBiTree FindNode( ThreadBiTree t )
{
	if( t->rtag == 1 )
		return t->right;
	else
	{
		t = t->right;
		while( t->ltag == 0 )
		{
			t = t->left;
		}	
		return t;
	}
}

/**
  *  中序方式遍历线索二叉树
  *  在VC6.0下测试成功
  *
  */
void InOrderThreadBiTree( ThreadBiTree t )
{
	if( t == NULL )
		return;
	printf( "%c ", t->data );
	ThreadBiTree p;
	
	//当只有一个元素时,并没有建立起线索二叉树
	if( t->ltag == 0 ) 
		p = t->left;
	else 
		p = t->right;

	while( p && ( p != t ) )
	{
		while( p->ltag == 0  )
		{	
			printf( "%c ", p->data );
			p = p->left;
		}
		printf( "%c ", p->data );
		
		while( p->rtag == 1 && p->right != t && p->right )
		{
			p = p->right;
			printf( "%c ", p->data );
		}
		p = p->right;
	}
}

/**
  *  插入右节点: 参考网上代码,有些地方需要商榷。
  * 
  *	
  */
void InsertRightNode( ThreadBiTree p, ThreadBiTree node )
{
    node->ltag = node->rtag = 1;//node->rtag=1为什么要置1,因为有node->right=p->right;这句
    node->left = p; //这可以考虑node->rtag = 0.
    node->right = p->right;//也可以让它为node->left = p->right,(^_^)是不是钻牛角尖了呢?
    p->right = p; //当然因为线索连接好了,为了不影响先前设置好的线索,故这样做,暂不考证!
    p->rtag = 0;
}

int main( void )
{
	ThreadBiTree t;
	t = CreateTree();

	PreThreadTree( t  );
	InOrderThreadBiTree( t );
	return 0;
}

 

分享到:
评论

相关推荐

    二叉树创建遍历及线索化

    二叉树创建遍历及线索化,二叉树的创建存储以及先序中序后序遍历,图形树输出

    二叉树的中序线索化和遍历

    最后,我们使用中序遍历算法来遍历线索二叉树,并输出每个节点的数据元素。 结论 ---------- 在本文中,我们讨论了二叉树的中序线索化和遍历算法。我们首先介绍了二叉树的基本概念,然后讨论了中序线索化和遍历...

    二叉树的遍历及线索化

    二叉树的遍历和线索化是理解和操作二叉树的关键技术。本篇将深入探讨这两大主题。 首先,我们来讨论二叉树的遍历。遍历二叉树是指按照特定顺序访问每个节点的过程。主要有三种常见的遍历方法: 1. **前序遍历...

    C语言数据结构之线索二叉树及其遍历

    `ThreadBinaryTree_PreOrderInput`函数则是利用先序遍历的方式创建一个线索二叉树,从输入中读取字符构建树结构。 中序遍历通常用于构造二叉搜索树,它能保证树中任意节点的左子树所有节点的值小于该节点,右子树...

    线索二叉树的建立、删除、插入、恢复线索

    线索二叉树的建立可以通过遍历二叉树并将每个结点的空指针域修改为指向其前驱和后继结点的指针来实现。该过程可以在二叉树的遍历过程中完成。具体来说,线索二叉树的建立可以分为以下步骤: 1. 对二叉树进行遍历,...

    线索二叉树的构建与遍历

    ### 线索二叉树的构建与遍历 #### 一、线索二叉树简介 线索二叉树(Threaded Binary Tree)是一种特殊的二叉树形式,它通过对空指针进行利用,使得二叉树的遍历过程更加高效。在普通的二叉树中,当某个节点没有左...

    C语言实现线索二叉树的定义与遍历示例

    我们可以使用函数CreateBiThrTree来创建线索二叉树,并使用函数InThreading或InOrderTraverse_Thr来进行中序遍历。 四、结论 本文介绍了C语言实现线索二叉树的定义与遍历,详细讲解了线索二叉树的结构体定义、遍历...

    实验8 线索二叉树的创建和遍历.docx

    【创建线索二叉树】的步骤如下: 1. **输入节点值**:首先,按照某种遍历顺序(如先序、中序或后序)输入二叉树的节点值,构建出原始的二叉树结构。 2. **线索化**:对每个节点进行处理,如果左孩子指针为空,将其...

    实验8 线索二叉树的创建和遍历.pdf

    在这个实验中,我们主要关注如何创建线索二叉树以及进行中序遍历。 首先,我们要理解线索二叉树的基本概念。在普通二叉树中,每个节点有两个指针,分别指向其左孩子和右孩子。线索二叉树通过增加两个附加标志...

    二叉树的遍历.doc

    - **创建二叉树**:根据先序遍历序列构造二叉树。 - **线索化操作**:通过`Preorderthreading`和`Inorderthreading`函数实现线索化,包括先序线索化和中序线索化。 - **线索化遍历**:`Preordertraverse3`和`...

    遍历和线索二叉树c语言版

    线索二叉树是二叉树的一种特殊形式,用于优化遍历操作,特别是当需要进行反向遍历时,线索二叉树能提供便利。本文将深入探讨线索二叉树的概念、实现以及遍历方法,以C语言为实现语言。 线索二叉树的概念源自于将...

    数据结构线索二叉树严蔚敏

    数据结构是计算机科学中的核心课程,它探讨了如何...在学习过程中,动手实践是十分重要的,通过编写代码实现线索二叉树的创建和遍历,可以帮助加深理解。此外,结合书上的例子和习题进行练习,也能有效巩固所学知识。

    PHP实现的线索二叉树及二叉树遍历方法详解

    创建线索二叉树的过程是在构建二叉树的同时进行的,遍历线索二叉树则主要通过中序线索二叉树进行,可以有顺序遍历和逆序遍历两种方式。 在上述PHP代码中,首先定义了两个类,一个是Node类,用于表示二叉树节点,...

    线索化二叉树的实现

    例如,先序遍历常用于创建二叉树的副本,而中序遍历常用于查找二叉树中的某个节点。 线索化二叉树的实现 线索化二叉树是指在二叉树的每个节点中添加了指向其前驱和后继节点的指针的二叉树。线索化二叉树可以快速地...

    线索二叉树实验报告.docx

    线索二叉树是一种特殊形式的二叉树,它在二叉树的基础上增加了线索,以便于在不使用递归的情况下进行二叉树的遍历。在本实验中,我们使用C语言实现了线索二叉树,主要涉及到以下几个核心知识点: 1. **线索二叉树的...

    线索二叉树算法

    在主函数`main`中,首先创建一个二叉树`T`,然后构建线索二叉树`Thrt`,最后进行中序遍历并打印结果。代码中的字符串`"-+a*b-cd/ef"`用来表示二叉树的构造顺序,其中: - `'-'`表示减法运算符; - `'+'`表示加法...

    二叉树的线索化(中序线索二叉树)

    在构建线索二叉树的过程中,我们需要遍历整棵树,同时根据当前节点在中序遍历序列中的位置,更新这两个线索指针。 在 `ThreadTree.java` 文件中,可能包含了二叉树的线索化实现。这个类可能包括了创建和操作二叉树...

    线索二叉树的建立,遍历(非递归,前,中,后序),删除.

    线索二叉树是一种特殊的二叉树,它在二叉链表的基础上增加了线索,用于辅助进行非递归遍历。在二叉链表中,每个节点包含一个指向左孩子的指针和一个指向右孩子的指针。线索二叉树通过在空指针上添加线索,指示前驱或...

    后续遍历线索二叉树 c 数据结构

    c,数据结构 用c写的线索二叉树的创建,后续遍历,输出

    xiansuoerchashu.rar_xiansuoerchashu_线索二叉树

    通过阅读这份资料,可以深入理解线索二叉树的创建、操作和应用。 总结来说,线索二叉树是一种增强型的二叉链表,通过添加线索,使得非递归遍历成为可能。在实际编程中,特别是在需要频繁进行非递归遍历的场景下,...

Global site tag (gtag.js) - Google Analytics