C++实现中序线索二叉树

原创 2015年07月08日 22:20:41
//线索二叉树的实现

#include "stdafx.h"
#include <iostream>

using namespace std;

enum flag{ Child, Thread };             //枚举类型,Child=0,Thread=1

template<typename T>
struct ThrNode{
	T data;
	ThrNode<T> *L_child, *R_child;
	flag L_tag, R_tag;
};

template<typename T>
class ThrBiTree{
public:
	ThrBiTree();    //初始化构造线索二叉树
	~ThrBiTree(){}
	ThrNode<T>* Creat_BiTree(ThrNode<T> *rt);    //建立二叉链表
	void MidOrder_Thread(ThrNode<T> *rt);
	void Mid_ThrBiTree(ThrNode<T> *rt, ThrNode<T> *pre);         //中序线索化
	ThrNode<T>* Next_Node(ThrNode<T> *p);       //查找结点p的后继结点
	ThrNode<T>* Pre_Node(ThrNode<T> *p);        //查找p的前驱结点
	ThrNode<T>* GetRoot(){ return root; }
	void Mid_Order(ThrNode<T> *rt);
private:
	ThrNode<T> *root;
};

template<typename T>
ThrBiTree<T>::ThrBiTree()
{ 
	root = Creat_BiTree(root);
	ThrNode<T>* pre = NULL;
	Mid_ThrBiTree(root, pre);
}

//先建立二叉链表,再遍历修改结点中的空指针,从而得到线索二叉链表
template<typename T>
ThrNode<T>* ThrBiTree<T>::Creat_BiTree(ThrNode<T> *rt){   
	T node_Value;
	cout << "输入结点值:";
	cin >> node_Value;
	if (node_Value == -1)
		rt = NULL;                            //空树
	else{
		rt = new ThrNode <T>;
		rt->data = node_Value;
		rt->L_tag = Child;                         //左右标志位均置为0
		rt->R_tag = Child;
		rt->L_child = Creat_BiTree(rt->L_child);  //递归建立左子树
		rt->R_child = Creat_BiTree(rt->R_child);  //递归建立右子树
	}
	return rt;
}

template<typename T>
void ThrBiTree<T>::Mid_ThrBiTree(ThrNode<T> *rt, ThrNode<T> *pre){
	ThrNode<T>* p = rt;
	if (p != NULL)
	{
		Mid_ThrBiTree(p->L_child, pre);          //递归左子树线索化
		cout << p->data << " ";                 //中序遍历输出
		if (p->L_child = NULL)                  //没有左孩子
		{
			p->L_tag = Thread;                 //前驱线索
			p->L_child = pre;                  //左孩子指针指向前驱
		}
		
		if (pre != NULL && pre->R_child == NULL)     //没有右孩子
		{
			pre->R_tag = Thread;  //后继线索
			pre->R_child = p; //前驱右孩子指针指向后继(当前结点p)
		}
		pre = p;             //pre始终是p的前驱,相当于p和pre各进行了一次中序遍历
		                    //p遍历时只改变结点的前驱指针域,pre遍历时只修改后继指针域
		Mid_ThrBiTree(p->R_child, pre);      //递归右子树线索化
	}
}

//*******************************************************************************

//编译通过,调用时出错,求指正
template<typename T>
ThrNode<T>* ThrBiTree<T>::Next_Node(ThrNode<T> *p){    //求结点p的后继
	ThrNode<T> *q;
	if (p->R_tag == Thread)         //右标志位为Thread,可直接得到后继结点
		q = p->R_child;
	else{                         //p存在右子树
		q = p->R_child;            //q指向p的右孩子
		while (q->L_tag == Child)       //查找最左下的结点
			q = q->L_child;
	}
	return q;
}

//编译通过,调用时出错,求指正
template<typename T>
ThrNode<T>* ThrBiTree<T>::Pre_Node(ThrNode<T> *p){   //求结点p的前驱
	ThrNode<T> *q;
	if (p->L_tag == Thread)
		q = p->L_child;
	else{
		q = p->L_child;
		while (q->R_tag == Child)
			q = q->R_child;
	}
	return q;
}

//编译通过,调用时出错,求指正
template<typename T>
void ThrBiTree<T>::Mid_Order(ThrNode<T> *rt){
	if (rt == NULL)
		return;
	ThrNode<T> *p = rt;
	cout << p->data << " ";
	while (p->R_child != NULL){
		if (p->R_tag == Thread){
			p = p->R_child;
			cout << p->data << " ";
		}
		else{
			p = p->R_child;
			while (p->L_tag == Child)
				p = p->L_child;
			cout << p->data << " ";
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	ThrBiTree<int> A;      //初始化没问题
	ThrNode<int> *rootNode = A.GetRoot();   //返回根结点
	cout << A.Next_Node(rootNode)->data << endl;    //调用出错,求指正
	cout << A.Pre_Node(rootNode)->data << endl;     
	A.Mid_Order(rootNode);
	return 0;
}

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

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

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

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

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

用c++实现二叉树的线索化

二叉树的线索化,先序、中序,测试用例 实现源代码: #include usi
  • yanxiaolx
  • yanxiaolx
  • 2016年05月30日 16:59
  • 752

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

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

线索二叉树C/C++

线索二叉树C/C++遍历二叉树就是以一定规则将二叉树中的节点排列成一个线性序列,从而得到二叉树节点的各种遍历序列。其实质就是对一个非线性序列进行线性化操作,使得在这个访问序列中每一个节点(除第一个和最...
  • CampusAmour
  • CampusAmour
  • 2017年03月03日 11:19
  • 279

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

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

C++实现二叉树及其线索化和遍历

/* * BiTree.h * * Created on: Oct 17, 2015 * Author: chris */ #ifndef BITREE_H_ #define ...
  • qq_21555605
  • qq_21555605
  • 2015年10月18日 11:18
  • 387

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

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

C++线索二叉树类实现

  • 2011年07月26日 22:40
  • 897KB
  • 下载

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

  • 2013年11月21日 17:33
  • 304KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++实现中序线索二叉树
举报原因:
原因补充:

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