zoukankan      html  css  js  c++  java
  • 线索二叉树

    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>()){}
    
    

    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);
    }
    
    

    test.cpp
    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;
    }
    
  • 相关阅读:
    正则表达式30分钟入门教程
    oracle常用的字符和字符串处理类函数
    [转载]C#实现软件自动更新思路
    ORACLE函数介绍
    xml 文件操作类
    oracle 主键生成策略
    wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
    NSIS开始...
    Oracle分析函数详述
    常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2438058.html
Copyright © 2011-2022 走看看