线索化二叉树C++

原创 2015年11月19日 10:15:31

线索化二叉树
1.创建二叉树
2.先序递归遍历输出二叉树
3.线索化二叉树
4.输出线索化二叉树

/*
线索化二叉树
	1.创建二叉树
	2.先序递归遍历输出二叉树
	3.线索化二叉树
	4.输出线索化二叉树
*/

#include<iostream>
#include<stack>
#include<string>
#include<fstream>
using namespace std;

class Node
{
public:
	char data;
	bool ltag, rtag;
	class Node *lchild, *rchild;
};

class Thread_Binary_Tree
{
public:

	Thread_Binary_Tree(){}
	~Thread_Binary_Tree(){}

	//创建二叉树
	void create_binary_tree(string filename)
	{
		ifstream readfile;
		string str;
		readfile.open(filename,ios::in);
		getline(readfile,str);
		cout << str << endl;
		Create_Tree(str);//创建二叉树
		readfile.close();
	}


	//先序递归输出二叉树
	void displayFront_tree()
	{
		cout << "先序递归输出" << endl;
		output_fro(t);//递归先序输出
		cout << endl;
	}

	//创建线索化二叉树
	void create_thread_Btree()
	{
		thread_root = CreateThread(t);
	}
	
	//输出线索化二叉树
	void display_thread_Btree()
	{
		cout << "中序线索化输出" << endl;
		output_thread(thread_root);
		cout << endl;
		cout << "中序线索化新根节点左右标记" << endl;
		cout << thread_root->ltag << "," << thread_root->rtag << endl;//输出中序线索化新根节点左右标记
	}
private:
	Node *t;
	Node *pre;
	Node *thread_root;
	//创建二叉树
	void Create_Tree(string str)
	{
		stack<Node *> m_stack;
		int k;
		Node *p;
		while (!str.empty())
		{
			if (str[0] == '(')
			{
				m_stack.push(p);
				k = 1;
			}
			else if (str[0] == ')')//必须使用if-else if
			{
				m_stack.pop();
			}
			else if (str[0] == ',')
			{
				k = 2;
			}
			else
			{
				p = (Node *)malloc(sizeof(Node));
				p->lchild = p->rchild = NULL;
				p->data = str[0];//将串首字符赋给data
				if (t == NULL)//处理根节点
				{
					t = p;
				}
				else
				{
					if (k == 1)
					{
						m_stack.top()->lchild = p;//左子树
					}
					if (k == 2)
					{
						m_stack.top()->rchild = p;//右子树
					}
				}
			}
			str.assign(str.substr(1, str.length() - 1));//构建新串,将串首字符除去
		}
	}

	//先序递归输出二叉树
	void output_fro(Node *t)
	{
		if (t == NULL)
		{
			return;
		}
		else
		{
			cout << t->data;
			if (t->lchild != NULL || t->rchild != NULL)
			{
				cout << "(";
				output_fro(t->lchild);//先序递归左子树
				if (t->rchild != NULL)
				{
					cout << ",";
				}
				output_fro(t->rchild);//先序递归右子树
				cout << ")";
			}
		}
	}

	//中序线索化二叉树
	void Thread(Node *&p)
	{
		if (p != NULL)
		{
			Thread(p->lchild);//向左直走
			if (p->lchild == NULL)//遍历到中序遍历输出的首节点且无左子节点
			{
				p->lchild = pre;//指向前驱节点
				p->ltag = true;
			}
			else//存在左子节点
			{
				p->ltag = false;
			}
			if (pre->rchild == NULL)//若右节点无子节点,则右指针指向后继节点
			{
				pre->rchild = p;
				pre->rtag = true;
			}
			else//存在右子节点
			{
				pre->rtag = false;
			}
			pre = p;//更新
			Thread(p->rchild);//处理右子树
		}
	}

	//创建线索化二叉树
	Node *CreateThread(Node *t)
	{
		Node *root;
		root = (Node *)malloc(sizeof(Node));//生成附加根节点
		root->ltag = false; root->rtag = true;
		root->rchild = t;
		if (t == NULL)//空树线索化
		{
			root->lchild = root;
		}
		else
		{
			root->lchild = t;
			pre = root;//pre初始化
			Thread(t);//线索化二叉树
			pre->rchild = root;//中序末节点
			pre->rtag = true;
			root->rchild = pre;//新生成根节点
			root->rtag = 1;//新生成根节点rtag=1;
		}
		return root;
	}

	//遍历输出线索化二叉树
	void output_thread(Node *t)
	{
		Node *p = t->lchild;
		while (p != t)
		{
			while (!p->ltag)
			{
				p = p->lchild;
			}
			cout << p->data << ends;
			
			while (p->rtag&&p->rchild != t)
			{
				p = p->rchild;
				cout << p->data << ends;
			}
			p = p->rchild;
		}
		
	}
};

int main()
{
	Thread_Binary_Tree m_tree;
	m_tree.create_binary_tree("data");//创建普通二叉树
	m_tree.displayFront_tree();//先序递归遍历输出
	m_tree.create_thread_Btree();//创建中序线索化二叉树
	m_tree.display_thread_Btree();//输出中序线索化二叉树
	return 0;
}
测试运行



版权声明:本文为博主原创文章,转载请注明出处,否则予以追究。

【c++】二叉树的线索化

什么是二叉树的线索化?或者问什么是线索二叉树? 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在改序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外...
  • LLZK_
  • LLZK_
  • 2016年10月18日 16:36
  • 736

数据结构_树_二叉树的线索化_C++实现

"head.h" #include #define LINK 0//定义节点类型:指针 #define THREAD 1//定于节点类型:线索 using namespace std; //...
  • Jack_Wong2010
  • Jack_Wong2010
  • 2011年09月21日 23:21
  • 3199

线索二叉树的原理以及创建和遍历(c++)

这是一篇非常好的关于线索二叉树的文章,内容详细到位,叙述清晰。作者是以为很认真、信息的人,估计花了不少时间和精力,向作者致敬! 引用地址:http://waret.iteye.com/blog/70...
  • wbcg111
  • wbcg111
  • 2016年03月26日 10:31
  • 1399

二叉树、线索二叉树类模版(C++)

  • 2013年11月21日 17:33
  • 304KB
  • 下载

【C++】后序线索化二叉树及其遍历

#include using namespace std; enum PointTag { LINK, THREAD, }; struct BinTreeThingNode { char _d...
  • ZDF0414
  • ZDF0414
  • 2015年11月28日 13:57
  • 812

二叉树线索化以及线索化的先序、中序、后序遍历

二叉树线索化以及线索化的先序、中序、后序遍历 有详细的图解 和 程序代码 解读,以及 为什么要线索化二叉树...
  • My_heart_
  • My_heart_
  • 2016年08月01日 18:04
  • 16345

轻松让你彻底搞定c++版 线索二叉树的线索化算法

二叉树图首先我们要先谈谈线索二叉树数据结构的出现理由,为什么要出现。我们可以不用线索二叉树吗,那是肯定的。谈线索二叉树之前你必须对二叉树的链式存储结构遍历非常了解。如果不了解请先搞懂先,我们知道二叉树...
  • qq_33060405
  • qq_33060405
  • 2017年11月11日 02:24
  • 110

[学习笔记]二叉树的线索化和遍历

文章首发:http://pjf.name/post-127.html       本文基于"姓名标识-非商业性-相同方式分享 4.0国际"协议创作或转载,转载原创文章请注明来源于疯子的自留地...
  • penjianfeng
  • penjianfeng
  • 2014年04月07日 08:56
  • 1131

C语言:线索二叉树的线索化及其遍历实现

前序和中序遍历都实现了,后序线索化还不是很明白!如有大神看到,望指正!不胜感激! // 中序线索二叉树实现.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #...
  • qq_28598203
  • qq_28598203
  • 2016年05月23日 00:31
  • 2599

数据结构例程——线索化二叉树(中序)

本文是数据结构基础系列(6):树和二叉树中第14课时线索二叉树的例程。#include #include #define MaxSize 100 typedef char ElemType; typ...
  • sxhelijian
  • sxhelijian
  • 2015年10月20日 05:36
  • 4568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线索化二叉树C++
举报原因:
原因补充:

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