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
  • 1009

中序线索化二叉树

/* 中序线索化二叉树 当用二叉树链表作为二叉树的存储结构时,因为每个结点中只有指向其左右孩子结点的指针 ,所以从任一结点出发只能直接找到该结点的左,右孩子。在一般的情况下靠它无法直接的 找...

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

本文是数据结构基础系列(6):树和二叉树中第14课时线索二叉树的例程。#include #include #define MaxSize 100 typedef char ElemType; typ...

中序线索化二叉树

#include #include#includetypedef char TElemType;typedef int status;typedef enum PointerTag{Link,Thre...
  • itgzr
  • itgzr
  • 2011年06月11日 21:15
  • 1787

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

线索化二叉树C++

线索化二叉树 1.创建二叉树 2.先序递归遍历输出二叉树 3.线索化二叉树 4.输出线索化二叉树...
  • J_Anson
  • J_Anson
  • 2015年11月19日 10:15
  • 627

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

二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 ...
  • ZDF0414
  • ZDF0414
  • 2015年11月22日 13:40
  • 689

二叉树之线索链表

二叉树的线索链表的Java实现

二叉树之中序线索

遍历二叉树是以一定的规则将二叉树中结点排列成一个线性序列,

采用中序线索链表存储结构,实现中序遍历

采用中序线索链表存储结构,实现中序遍历 (1)定义线索链表的存储结构; (2)按先序遍历创建一棵二叉链表树; (3)实现二叉链表的中序线索化; (4)实现中序线索链表的中序遍历。 #incl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++实现中序线索二叉树
举报原因:
原因补充:

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