线索二叉树
来源:互联网 发布:js页面加载事件 编辑:程序博客网 时间:2024/05/12 09:34
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>;private:int m_nleftthread, m_nrightthread;ThreadNode<Type> *m_pleft, *m_pright;Type m_data;public: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){}};
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;};
ThreadInorderIterator.h
#include "ThreadTree.h"template<typename Type> class ThreadInorderIterator{private:ThreadTree<Type> &m_ptree;ThreadNode<Type> *m_pcurrent;void InThread(ThreadNode<Type> *current, ThreadNode<Type> *pre);public:ThreadInorderIterator(ThreadTree<Type> &tree):m_ptree(tree),m_pcurrent(tree.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);};
ThreadInorderIterator.cpp
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
#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;}
- 线索二叉树 --->树
- 线索二叉树算法
- C#线索二叉树
- 线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树
- 线索化二叉树
- 线索二叉树
- C#线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树实例
- 线索二叉树
- 线索二叉树算法
- C++线索二叉树
- 线索二叉树
- 线索二叉树实现
- 【新语丝】中医科研论文套路和批判
- [c/c++]宏定义,#,##
- 在vb.net中如何用Graphics画图(
- 遍历HashMap
- javaEE 无法安装axis2 1.6插件;Tomcat无法启动,提示端口占用;Tomcat服务发布;axis2发布配置;syso自动补全
- 线索二叉树
- 域的定义
- 验证上传文件的类型
- 如何使下面的左右滚动条不出现, 右边滚条保留
- linux命令练习 笔记
- 基于visual c++之windows核心编程代码分析(22)Mapping File编程
- Access restriction: The type XXX is not accessible due to restriction on required library XXX
- 全文检索Lucene使用与优化
- 关于内存屏障