#include
using namespace std;enum PointerTag{                 THREAD,                 LINK};template
struct BinaryTreeNodeThd{                BinaryTreeNodeThd( const T & x)                                :_data( x)                                ,_left( NULL)                                ,_right( NULL)                                ,_parent( NULL)                                ,_leftTag( LINK)                                ,_rightTag( LINK)                {}                 T _data;                 BinaryTreeNodeThd
* _left;                 BinaryTreeNodeThd
* _right;                 BinaryTreeNodeThd
* _parent;                 PointerTag _leftTag;           //左孩子线索标志                 PointerTag _rightTag;          //右孩子线索标志};template
struct BinaryTreeThd{public:                BinaryTreeThd< T>()                                :_root( NULL)                {}                BinaryTreeThd< T>(const T* a,size_t size)                {                                 size_t index=0;                                _root=_CreateTree( a,index,size );                }                 //中序线索化                 void InOrderThreading()                {                                 BinaryTreeNodeThd
* prev=NULL;                                _InOrderThreading(_root,prev);                }                 //前序线索化                 void PreOrderThreading()                {                                 BinaryTreeNodeThd
* prev=NULL;                                _PreOrderThreading(_root,prev);                }                 //后序线索化                 void PostOrderThreading()                {                                 BinaryTreeNodeThd
* prev=NULL;                                _PostOrderThreading(_root,prev);                }                 //中序线索化的遍历                 void InOrderThd()                {                                 BinaryTreeNodeThd
* cur=_root;                                 while(cur)                                {                                                 while(cur&&(cur->_leftTag!=THREAD ))   //找到最左节点                                                {                                                                cur=cur->_left;                                                }                                                cout<
_data<< " ";    //输出最左节点                                                 while(cur->_rightTag!=LINK )   //找后继节点                                                {                                                                cur=cur->_right;                                                                cout<
_data<< " ";                                                }                                                cur=cur->_right;                                }                                cout<
* cur=_root;                                 while(cur)                                {                                                 while(cur&&cur->_leftTag==LINK )                                                {                                                                cout<
_data<< " ";                                                                cur=cur->_left;                                                }                                                cout<
_data<< " ";                                                cur=cur->_right;                                }                                cout<
_left==NULL &&_root->_right==NULL)    //只有一个节点的情况                                                cout<<_root->_data<
* cur=_root->_left;                                 BinaryTreeNodeThd
* prev=NULL;                                 while(cur)                                {                                                 while(cur&&cur->_leftTag==LINK )                                                                cur=cur->_left;                                                 while(cur&&cur->_rightTag==THREAD )                                                {                                                                cout<
_data<< " ";                                                                prev=cur;                                                                cur=cur->_right;                                                }                                                 if(cur==_root)                                                {                                                                cout<<_root->_data<< " ";                                                                 break;                                                }                                                 while(cur&&cur->_rightTag==LINK &&cur->_right==prev)                                                {                                                                cout<
_data<< " ";                                                                prev=cur;                                                                cur=cur->_parent;                                                }                                                 if(cur&&cur->_rightTag==LINK )                                                                cur=cur->_right;                                }                                cout<
* _CreateTree(const T* a,size_t& index,size_t size)    //递归创建树                {                                 BinaryTreeNodeThd
* root=NULL;                                 if((index 
(a[index]);                                                root->_left=_CreateTree( a,++index ,size);                                                 if(root->_left)                                                                root->_left->_parent=root;                                                root->_right=_CreateTree( a,++index ,size);                                                 if(root->_right)                                                                root->_right->_parent=root;                                }                                 return root;                }                 //中序线索化内部函数                 void _InOrderThreading(BinaryTreeNodeThd 
* cur,BinaryTreeNodeThd 
*& prev)                {                                 if(cur ==NULL)                                                 return;                                _InOrderThreading( cur->_left,prev );      //一直找到最左边的节点                                 //线索化                                 if(cur ->_left==NULL)                                {                                                 cur->_leftTag=THREAD ;                                                 cur->_left=prev ;                                }                                 if(prev &&prev->_right== NULL)                                {                                                 prev->_rightTag=THREAD ;                                                 prev->_right=cur ;                                }                                 prev=cur ;     //prev要动起来                                _InOrderThreading( cur->_right,prev );                }                 //前序线索化的内部函数                 void _PreOrderThreading(BinaryTreeNodeThd 
* cur,BinaryTreeNodeThd 
*& prev)                {                                 if(cur ==NULL)                                                 return;                                 //线索化                                 if(cur ->_left==NULL)                                {                                                 cur->_leftTag=THREAD ;                                                 cur->_left=prev ;                                }                                 if(prev &&prev->_right== NULL)                                {                                                 prev->_rightTag=THREAD ;                                                 prev->_right=cur ;                                }                                 prev=cur ;      //prev要动起来                                 if(cur ->_leftTag==LINK)                                                _PreOrderThreading( cur->_left,prev );                                 if(cur ->_rightTag==LINK)                                                _PreOrderThreading( cur->_right,prev );                }                 //后序线索化的内部函数                 void _PostOrderThreading(BinaryTreeNodeThd 
* cur,BinaryTreeNodeThd 
*& prev)                {                                 if(cur ==NULL)                                                 return;                                _PostOrderThreading( cur->_left,prev );                                _PostOrderThreading( cur->_right,prev );                                 //线索化                                 if(cur ->_left==NULL)                                {                                                 cur->_leftTag=THREAD ;                                                 cur->_left=prev ;                                }                                 if(prev &&prev->_right== NULL)                                {                                                 prev->_rightTag=THREAD ;                                                 prev->_right=cur ;                                }                                 prev=cur ;    //prev要动起来                }protected:                 BinaryTreeNodeThd
* _root;};void test(){                 int array1[10]={1,2,3,'#' ,'#',4,'#','#',5,6};                 //int array1[1]={1};                 BinaryTreeThd
 btt1(array1,10);                btt1.InOrderThreading();                btt1.InOrderThd();       //3 2 4 1 6 5                 /*btt1.PreOrderThreading();                btt1.PreOrderThd();    */     //1 2 3 4 5 6                 /*btt1.PostOrderThreading();                 btt1.PostOrderThd();  */       //3 4 2 6 5 1                 int array2[15]={1,2,'#' ,3,'#','#',4,5, '#',6,'#' ,7,'#','#',8};                 BinaryTreeThd
 btt2(array2,15);                btt2.InOrderThreading();                btt2.InOrderThd();      //2 3 1 5 6 7 4 8                 //btt2.PreOrderThreading();       //1 2 3 4 5 6 7 8                 //btt2.PreOrderThd();                 /*btt2.PostOrderThreading();                btt2.PostOrderThd();  */      //3 2 7 6 5 8 4 1}int main(){                test();                system( "pause");                 return 0;}