`
waret
  • 浏览: 139452 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

穿线二叉树的实现

 
阅读更多
#include <iostream>
#include <sstream>
using namespace std;

template<class T>
struct tbtnode
{
	T s_t;
	bool lflag;
	bool rflag;
	tbtnode *lchild;
	tbtnode *rchild;
};

template<class T>
tbtnode<T>* createtbt(tbtnode<T>* tbt, int k, ostream& out, istream& in)
{
	tbtnode<T> *p, *t;
	T tmp;
	out << "Input key: " << endl;
	in >> tmp;
	out << '\t' << tmp << endl;
	if ('0' != tmp)
	{
		p = new tbtnode<T>;
		p->s_t = tmp;
		p->lchild = NULL;
		p->rchild = NULL;
		p->lflag = 0;
		p->rflag = 0;
		if (0 == k) t = p;
		if (1 == k) tbt->lchild = p;
		if (2 == k) tbt->rchild = p;

		createtbt(p, 1, out, in);
		createtbt(p, 2, out, in);
	}

	return (t);
}

template<class T>
void pretraverse(tbtnode<T> *root)
{
	if (NULL != root)
	{
		cout << root->s_t << " ";
		pretraverse(root->lchild);
		pretraverse(root->rchild);
	}
}

template<class T>
void intraverse(tbtnode<T> *root)
{
	if (NULL != root)
	{
		intraverse(root->lchild);
		cout << root->s_t << " ";
		intraverse(root->rchild);
	}
}

template<class T>
void postraverse(tbtnode<T> *root)
{
	if (NULL != root)
	{
		postraverse(root->lchild);
		postraverse(root->rchild);
		cout << root->s_t << " ";
	}
}

template<class T>
void inthread(tbtnode<T> *tbt, tbtnode<T> **h)
{
	if (NULL != tbt)
	{
		inthread(tbt->lchild, h);
		if (tbt->lchild == NULL)
		{
			tbt->lchild = *h;
			tbt->lflag = 1;
		}
		if ((*h != NULL) && ((*h)->rchild == NULL))
		{
			(*h)->rchild = tbt;
			(*h)->rflag = 1;
		}
		*h = tbt;
		inthread(tbt->rchild, h);
	}
}

template<class T>
void prethread(tbtnode<T> *tbt, tbtnode<T> **h)
{
	if (NULL != tbt)
	{
		if (tbt->lchild == NULL)
		{
			tbt->lchild = *h;
			tbt->lflag = 1;
		}

		if ((*h != NULL) && ((*h)->rchild == NULL))
		{
			(*h)->rchild = tbt;
			(*h)->rflag = 1;
		}

		*h = tbt;
		//*h = tbt->lchild;
		if (tbt->lflag == 0)
			prethread(tbt->lchild, h);
		if (tbt->rflag == 0)		
			prethread(tbt->rchild, h);
	}
}

template<class T>
void posthread(tbtnode<T> *tbt, tbtnode<T> **h)
{
	if (NULL != tbt)
	{
		posthread(tbt->lchild, h);
		posthread(tbt->rchild, h);

		if (tbt->lchild == NULL)
		{
			tbt->lchild = *h;
			tbt->lflag = 1;
		}

		if ((*h != NULL) && ((*h)->rchild == NULL))
		{
			(*h)->rchild = tbt;
			(*h)->rflag = 1;
		}
		*h = tbt;
	}
}

template<class T>
void inthtraverse(tbtnode<T> *tbt)
{
	tbtnode<T> *h;
	if (tbt == NULL) return;
	h = tbt;
	while (h->lflag == 0) h = h->lchild;
	cout << h->s_t << " ";
	while (h->rchild != NULL)
	{
		if (h->rflag == 1)
			h = h->rchild;
		else
		{
			h = h->rchild;
			while ((h->lflag == 0) && (h->lchild != NULL))
				h = h->lchild;
		}
		cout << h->s_t << " ";
	}
}

template<class T>
void prethtraverse(tbtnode<T> *tbt)
{
	tbtnode<T> *h;
	if (tbt == NULL) return;
	h = tbt;
	cout << tbt->s_t << " ";
	while (h->rchild != NULL)
	{
		if ((h->lflag == 0) && (h->lchild != NULL))
		{
			h = h->lchild;
		}
		else
		{
			h = h->rchild;
		}
		cout << h->s_t << " ";
	}
}

template<class T>
void posthtraverse(tbtnode<T> *tbt)
{
	tbtnode<T> *h;
	if (tbt == NULL) return;
	h = tbt;
}

int main()
{
	typedef tbtnode<char> tbtnode_char;
	tbtnode_char *root;
	//istringstream ssin(string("AB0DG000CE0H00F00"));
	istringstream ssin(string("ABCD00E00FG00H00IJK00L00MN00O00"));
	root = createtbt(root, 0, cout, ssin);
	pretraverse(root);
	cout << endl;
	intraverse(root);
	cout << endl;
	postraverse(root);
	cout << endl;

	cout << "通过穿线二叉树进行遍历" << endl;
	tbtnode_char *h = NULL;

	//inthread(root, &h);
	//inthtraverse(root);

	prethread(root, &h);
	prethtraverse(root);

	cout << endl;

	return 0;
}
 
分享到:
评论

相关推荐

    第7章_二叉树.pptx

    本章主要讲解了二叉树的基本概念、存储结构、遍历算法、穿线二叉树和树、森林与二叉树的转换等知识点。 一、基本概念 * 二叉树的定义:二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根结点及两...

    c++编写的二叉树遍历程序

    在C++中实现二叉树的中序穿线,通常包括以下步骤: 1. 初始化所有节点的“穿线”指针为NULL。 2. 在中序遍历过程中,当访问到一个叶子节点或右子节点为空的非叶子节点时,将它的“穿线”指针指向其父节点的左子节点...

    数据结构课件---二叉树

    - 在中序遍历时,通过在线性结构(如链表)中穿线,方便后续的查找和操作。 5. **最优二叉树**: - 通常指哈夫曼树(Huffman Tree),是一种带权路径长度最短的二叉树,常用于数据压缩。 6. **树和森林**: - ...

    电脑基础知识基本数据结构及其运算PPT学习教案.pptx

    在实际应用中,为了提高遍历和查找的效率,有时会采用穿线二叉树这种特殊结构。通过在节点间添加线索,我们可以快速访问节点的前驱和后继节点,避免了复杂的回溯过程。此外,二叉树还常用于表达式的线性化处理,即将...

    数据结构课程内容与典型题型分析

    6. **穿线二叉树的定义**:穿线二叉树是在二叉树的基础上增加指向左子树中最大的节点或右子树中最小的节点的指针,从而方便了中序遍历等操作。 7. **树、森林和二叉树的转换**:树(或森林)和二叉树之间可以相互...

    数据结构课程内容与典型题型

    穿线二叉树的定义** - **定义**:通过在二叉树节点之间添加指针,使得可以按照某种顺序遍历所有节点。 **6. 树、森林和二叉树的转换** - **转换**:树(森林)与二叉树之间的相互转换。 #### 八、图 **1. 图的...

    软件工程师考试大纲(职称)

    2.6 树与森林,如二叉树遍历、穿线二叉树、堆和霍夫曼树。 2.7 图,涉及图的存储、遍历、最小生成树和最短路径计算。 2.8 集合与搜索,包括集合表示和搜索算法。 通过这个大纲,我们可以看出软件工程师考试的核心...

    小米 2018春季实习生前端开发、算法工程师笔试题合集.docx

    "小米 2018春季实习生前端开发、算法工程师笔试题合集" 本文档包含了小米 2018春季实习生...10. 一棵完全二叉树具有 1000 个结点,则此完全二叉树有: * 答案是 10 层 知识点: * 完全二叉树 * 结点数 * 树的高度

    北京大学_acm程序设计_图论讲义

    - **中序穿线二叉树**:通过对二叉树进行中序遍历,并利用栈来实现中序线索化的过程。这种技术在处理具有大量节点的二叉树时非常有用,可以减少遍历过程中的递归调用次数。 - **广度优先搜索**:使用队列来存储待...

    数据结构教案(清华大学自动化)

    - **树**:树形结构,包括**二叉树**、**二叉排序树**、**穿线二叉树**、**堆**、**哈夫曼树**等,广泛应用于各种算法中。 - **图**:节点通过边连接形成的网络,涉及**图的遍历**、**最小生成树**、**最短路径**...

Global site tag (gtag.js) - Google Analytics