线索二叉树

    今天,我们一起用C++实现一颗线索二叉树,具体代码如下:

ThreadInorderIterator.h具体内容如下:

#include "ThreadTree.h"

template<typename Type> class ThreadInorderIterator{
public:
	ThreadInorderIterator(ThreadTree<Type> &tree) :m_ptree(tree), m_pcurrent(tree.m_proot){
		//InThread(m_ptree.m_proot->m_pleft,m_ptree.m_proot);
	}

	ThreadNode<Type> *First();
	ThreadNode<Type> *Prior();
	ThreadNode<Type> *Next();

	void Print();
	void Print(ThreadNode<Type> *start, int n = 0);
	void InOrder();
	void InsertLeft(ThreadNode<Type> *left);
	void InsertRight(ThreadNode<Type> *right);
	ThreadNode<Type> *GetParent(ThreadNode<Type> *current);


private:
	ThreadTree<Type> &m_ptree;
	ThreadNode<Type> *m_pcurrent;
	void InThread(ThreadNode<Type> *current, ThreadNode<Type> *pre);
};

template<typename Type> void ThreadInorderIterator<Type>::InThread(
	ThreadNode<Type> *current, ThreadNode<Type> *pre){
	if (current != m_ptree.m_proot){
		InThread(current->m_pleft, pre);
		if (current->m_pleft == NULL){
			current->m_pleft = pre;
			current->m_nleftthread = 1;
		}
		if (pre->m_pright == NULL){
			pre->m_pright = current;
			pre->m_nrightthread = 1;
		}

		pre = current;
		InThread(current->m_pright, pre);
	}
}

template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::First(){
	while (m_pcurrent->m_nleftthread == 0){
		m_pcurrent = m_pcurrent->m_pleft;
	}
	return m_pcurrent;
}

template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::Prior(){
	ThreadNode<Type> *pmove = m_pcurrent->m_pleft;
	if (0 == m_pcurrent->m_nleftthread){
		while (0 == pmove->m_nrightthread){
			pmove = pmove->m_pright;
		}
	}
	m_pcurrent = pmove;
	if (m_pcurrent == m_ptree.m_proot){
		return NULL;
	}
	return m_pcurrent;
}

template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::Next(){
	ThreadNode<Type> *pmove = m_pcurrent->m_pright;
	if (0 == m_pcurrent->m_nrightthread){
		while (0 == pmove->m_nleftthread){
			pmove = pmove->m_pleft;
		}
	}
	m_pcurrent = pmove;
	if (m_pcurrent == m_ptree.m_proot){
		return NULL;
	}
	return m_pcurrent;
}

template<typename Type> void ThreadInorderIterator<Type>::InOrder(){
	ThreadNode<Type> *pmove = m_ptree.m_proot;
	while (pmove->m_pleft != m_ptree.m_proot){
		pmove = pmove->m_pleft;
	}
	m_pcurrent = pmove;
	cout << "root";
	while (pmove != m_ptree.m_proot&&pmove){
		cout << "--->" << pmove->m_data;
		pmove = this->Next();
	}
	cout << "--->end";
}

template<typename Type> void ThreadInorderIterator<Type>::InsertLeft(ThreadNode<Type> *left){
	left->m_pleft = m_pcurrent->m_pleft;
	left->m_nleftthread = m_pcurrent->m_nleftthread;
	left->m_pright = m_pcurrent;
	left->m_nrightthread = 1;
	m_pcurrent->m_pleft = left;
	m_pcurrent->m_nleftthread = 0;
	if (0 == left->m_nleftthread){
		m_pcurrent = left->m_pleft;
		ThreadNode<Type> *temp = First();
		temp->m_pright = left;
	}
	m_pcurrent = left;
}

template<typename Type> void ThreadInorderIterator<Type>::InsertRight(ThreadNode<Type> *right){
	right->m_pright = m_pcurrent->m_pright;
	right->m_nrightthread = m_pcurrent->m_nrightthread;
	right->m_pleft = m_pcurrent;
	right->m_nleftthread = 1;
	m_pcurrent->m_pright = right;
	m_pcurrent->m_nrightthread = 0;
	if (0 == right->m_nrightthread){
		m_pcurrent = right->m_pright;
		ThreadNode<Type> *temp = First();
		temp->m_pleft = right;
	}
	m_pcurrent = right;
}

template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::GetParent(
	ThreadNode<Type> *current){
	ThreadNode<Type> *pmove = current;
	while (0 == pmove->m_nleftthread){
		pmove = pmove->m_pleft;
	}
	pmove = pmove->m_pleft;
	if (pmove == m_ptree.m_proot){
		if (pmove->m_pleft == current){
			return NULL;
		}
	}
	if (pmove->m_pright == current){
		return pmove;
	}
	pmove = pmove->m_pright;
	while (pmove->m_pleft != current){
		pmove = pmove->m_pleft;
	}
	return pmove;
}

template<typename Type> void ThreadInorderIterator<Type>::Print(ThreadNode<Type> *start, int n){
	if (start->m_nleftthread&&start->m_nrightthread){
		for (int i = 0; i < n; i++){
			cout << "     ";
		}
		if (n >= 0){
			cout << start->m_data << "--->" << endl;
		}

		return;
	}
	if (start->m_nrightthread == 0){
		Print(start->m_pright, n + 1);
	}
	for (int i = 0; i < n; i++){
		cout << "     ";
	}
	if (n >= 0){
		cout << start->m_data << "--->" << endl;
	}
	if (start->m_nleftthread == 0){
		Print(start->m_pleft, n + 1);
	}
}

template<typename Type> void ThreadInorderIterator<Type>::Print(){
	Print(m_ptree.m_proot->m_pleft);
}
ThreadNode.h具体内容如下:

template<typename Type> class ThreadTree;
template<typename Type> class ThreadInorderIterator;

template<typename Type> class ThreadNode{
public:
	friend class ThreadTree < Type > ;
	friend class ThreadInorderIterator < Type > ;
	ThreadNode() :m_nleftthread(1), m_nrightthread(1){
		m_pleft = this;
		m_pright = this;
	}
	ThreadNode(const Type item) :m_data(item), m_pleft(NULL), m_pright(NULL)
		, m_nleftthread(0), m_nrightthread(0){}

private:
	int m_nleftthread, m_nrightthread;
	ThreadNode<Type> *m_pleft, *m_pright;
	Type m_data;
};
ThreadTree.h具体内容如下:

#include "ThreadNode.h"

template<typename Type> class ThreadInorderIterator;

template<typename Type> class ThreadTree{
public:
	friend class ThreadInorderIterator < Type > ;
	ThreadTree() :m_proot(new ThreadNode<Type>()){}

private:
	ThreadNode<Type> *m_proot;
};
main.cpp具体内容如下:

#include <iostream>

using namespace std;

#include "ThreadInorderIterator.h"

int main(){
	ThreadTree<int> tree;
	ThreadInorderIterator<int> threadtree(tree);
	int init[10] = { 3, 6, 0, 2, 8, 4, 9, 1, 5, 7 };
	for (int i = 0; i < 10;){
		threadtree.InsertLeft(new ThreadNode<int>(init[i++]));
		threadtree.InsertRight(new ThreadNode<int>(init[i++]));
	}
	threadtree.Print();
	cout << endl << endl;

	threadtree.InOrder();
	return 0;
}
运行效果如图1所示:

图1 运行效果


posted on 2014-09-14 15:44  三少爷的剑123  阅读(103)  评论(0编辑  收藏  举报

导航