【数据结构】二叉树的线索化
来源:互联网 发布:淘宝企业店营业执照 编辑:程序博客网 时间: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
- 数据结构之二叉树的线索化
- 数据结构--二叉树的线索化
- 【数据结构】二叉树的线索化
- 数据结构-二叉树的线索化
- 数据结构 — 二叉树的线索化
- 【数据结构】二叉树的线索化!!
- 数据结构线索化二叉树
- 数据结构::线索化二叉树
- 数据结构二叉树线索化
- 数据结构二叉树线索化
- 数据结构--树和二叉树--二叉树的线索化
- 数据结构实验 建树+线索化二叉树+线索二叉树的遍历
- 数据结构-->线索二叉树
- 数据结构--线索二叉树
- 【数据结构】线索二叉树
- 数据结构-线索二叉树
- 数据结构 - 线索二叉树
- 线索二叉树-数据结构
- IP地址字符串与数组转换
- 第一行代码笔记,第一章-------开启你的第一行Android代码
- hdu1455sticks
- NOIP2003 神经网络
- P1155 双栈排序
- 【数据结构】二叉树的线索化
- java 工程师 linux常用命令
- Android布局详解之二:LinearLayout
- 排列统计 jzoj 1283
- iOS开发笔记
- 贪婪匹配
- 常用java服务器
- “==”和equals的理解
- struts2+spring4.x+hibernate5.x