今天,我们一起用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);
- }
- 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;
- };
- #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;
- };
- #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 运行效果