二叉树的线索化可以使得二叉树的非递归遍历不需借助栈或队列这种数据结构,最主要的是可以为之提供迭代器。线索化二叉树有三种方式:前序线索化、中序线索化、后序线索化(后序线索化需要三叉链结构)这里主要讲前序线索化和中序线索化,并为中序线索化提供迭代器。
线索化的思想就是将一颗二叉树遍历转换成有序双向链表进行访问。这样二叉树的节点结构就应该多一个前驱和后继的线索化标志。
节点结构
enum PointerType
{
THREAD,
LINK
};
template<class T>
struct BinaryTreeThd
{
BinaryTreeThd<T>* _left;
BinaryTreeThd<T>* _right;
T _data;
PointerType _leftType; //前驱
PointerType _rightType; //后继
BinaryTreeThd(const T& x) //节点初始化
:_data(x),_left(NULL),_right(NULL),_leftType(NULL),_rightType(NULL)
{}
};
下面来看二叉树线索化
template<class T>
class BinaryTreeThd
{
typedef BinaryTreeThdNode<T> Node;
public:
BinaryTreeThd(T* a,size_t n,const T& invalid)
{
size_t index;
_root = CreaterTree(a, n, invalid,index);
}
Node* CreaterTree(T* a,size_t n,const T& invalid,size_t& index)
{
Node* root = NULL;
if(index<n && a[index] != invalid)
{
root = new Node(a[index]);
root->_left = CreaterTree(a,n,invalid,++index);
root->_right = CreaterTree(a,n,invalid,++index);
}
}
void InOrderThreading<