【数据结构】二叉树的线索化

来源:互联网 发布:淘宝企业店营业执照 编辑:程序博客网 时间:2024/05/21 19:33
现将二叉树的结点结构重新定义如下:
leftchild
lefttag
_date
righttag
rightchild
其中:lefttag=0 时leftchild指向左子女;
lefttag=1 时leftchild指向前驱;
righttag=0 时rightchild指向右子女;
righttag=1 时rightchild指向后继
中序线索二叉树图如下

创建二叉树
void  _CreateTree(Node*& root,T a[],size_t size,size_t& index ,const T& invalid){assert(a);if(index< size&& a[index]!=invalid){root=new Node(a[index]);_CreateTree(root->leftchild,a,size,++index,invalid);_CreateTree(root->rightchild,a,size,++index,invalid);}}

中序线索化
void _InOrderThead(Node* root,Node* &pre){     if(root==NULL) return ; _InOrderThead(root->leftchild,pre); if(root->leftchild==NULL) { root->LeftTag=Thread; root->leftchild=pre; } if(pre&&pre->rightchild==NULL) { pre->RightTag=Thread; pre->rightchild=root; } pre=root; _InOrderThead(root->rightchild,pre);}

前序线索化
void _PrevOrderThead(Node* root,Node* &pre){if(root==NULL)return ;if(root->leftchild==NULL){root->LeftTag=Thread;root->leftchild=pre;}if(pre&&pre->rightchild==NULL){pre->RightTag=Thread;pre->rightchild=root;}pre=root;if(root->LeftTag==Link)_PrevOrderThead(root->leftchild,pre);if(root->RightTag==Link)_PrevOrderThead(root->rightchild,pre);}

后序线索化
void _PostOrderThead(Node* root,Node* &pre){if(root==NULL)return;_PostOrderThead(root->leftchild,pre);_PostOrderThead(root->rightchild,pre);if(root->leftchild==NULL){root->LeftTag=Thread;root->leftchild=pre;}if(pre&&pre->rightchild==NULL){pre->RightTag=Thread;pre->rightchild=root;}pre=root;}

详细代码实现
#include<iostream>#include<stack>#include<queue>#include <assert.h>using namespace std;enum PointTag{Link,//指针Thread//线索};template <class T>struct  BinTreeNode{T _date;    BinTreeNode<T>* leftchild;//左孩子BinTreeNode<T>* rightchild;//右孩子PointTag LeftTag;//左孩子线索化标志PointTag RightTag;//右孩子线索化标志BinTreeNode(const T& x):_date(x),leftchild(NULL),rightchild(NULL),LeftTag(Link),RightTag(Link){}};template <class T>class BinTree{typedef BinTreeNode<T> Node;public:BinTree():_root(NULL){}BinTree(T* a,size_t size,const T& invalid):_root(NULL){size_t index=0;_CreateTree( _root,a,size,index,invalid);}void PrevOrderThead(){Node* pre=NULL;_PrevOrderThead(_root,pre);}void PrevOrder_NonR(){Node* root=_root;if(root==NULL)return;while(root){while(root->LeftTag==Link){cout<<root->_date<<" ";root=root->leftchild;}cout<<root->_date<<" ";root=root->rightchild;}cout<<endl;}void InOrderThead(){Node* pre=NULL;_InOrderThead(_root,pre);}void InOrder_NonR(){Node* root=_root;if(root==NULL)return;while(root){while(root->LeftTag==Link){root=root->leftchild;}cout<<root->_date<<" ";while (root->RightTag==Thread){root=root->rightchild;cout<<root->_date<<" ";}            root=root->rightchild;}cout<<endl;}void PostOrderThead(){Node* pre=NULL;_PostOrderThead(_root,pre);}void PostOrder_NonR(){}protected:void  _CreateTree(Node*& root,T a[],size_t size,size_t& index ,const T& invalid){assert(a);if(index< size&& a[index]!=invalid){root=new Node(a[index]);_CreateTree(root->leftchild,a,size,++index,invalid);_CreateTree(root->rightchild,a,size,++index,invalid);}}void _InOrderThead(Node* root,Node* &pre){     if(root==NULL) return ; _InOrderThead(root->leftchild,pre); if(root->leftchild==NULL) { root->LeftTag=Thread; root->leftchild=pre; } if(pre&&pre->rightchild==NULL) { pre->RightTag=Thread; pre->rightchild=root; } pre=root; _InOrderThead(root->rightchild,pre);}void _PrevOrderThead(Node* root,Node* &pre){if(root==NULL)return ;if(root->leftchild==NULL){root->LeftTag=Thread;root->leftchild=pre;}if(pre&&pre->rightchild==NULL){pre->RightTag=Thread;pre->rightchild=root;}pre=root;if(root->LeftTag==Link)_PrevOrderThead(root->leftchild,pre);if(root->RightTag==Link)_PrevOrderThead(root->rightchild,pre);}void _PostOrderThead(Node* root,Node* &pre){if(root==NULL)return;_PostOrderThead(root->leftchild,pre);_PostOrderThead(root->rightchild,pre);if(root->leftchild==NULL){root->LeftTag=Thread;root->leftchild=pre;}if(pre&&pre->rightchild==NULL){pre->RightTag=Thread;pre->rightchild=root;}pre=root;}private:Node* _root;};


0 0
原创粉丝点击