1. 定义
1.1 起源
对于n个节点的二叉树,会有多少个空指针域呢?
Key: n+1个
对于n+1个NULL指针能不能够很好的利用起来呢??
1.2 线索二叉树
利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这样的二叉树叫线索二叉树。
如果前驱和后继分别对应先序遍历,那么这叫先序线索树,同样有中序线索树,后序线索树。
1.3 优点
很好的解决了二叉树只能通过遍历寻找前驱和后继的问题。
2. 结构
2.1 node
lchild
|
ltag
|
data
|
rtag
|
rchild
|
ltag=1 时lchild指向前驱;
rtag=0 时rchild指向右子女;
rtag=1 时rchild指向后继;
2.2 structure of tree
中序线索树,如图(a)无头节点; (b)有头节点3. 线索化
以中序线索化为例:template <typename T>
void CXThreadBitTree<T>::InThreadTree()
{
CXThreadTreeNode<T> *node = m_root;
CXThreadTreeNode<T> *pre_node = NULL;
InThread( node, pre_node );
}
template <typename T>
void CXThreadBitTree::InThread( CXThreadTreeNode<T> *cur_node, CXThreadTreeNode<T>*pre_node )
{
if( !cur_node )
{
InThread( cur_node->GetLeft(), pre_node ); //左子树线索化
if( !cur_node->GetLeft() )
{
cur_node->mi_ltag = 1; //前驱线索
cur_node->m_lchild = pre_node;
}
else
cur_node->mi_ltag = 0;
if( !pre_node->GetRight() )
{
pre_node->mi_rtag = 1; //后驱线索
pre_node->m_rchild = cur_node;
}
else
pre_node->mi_rtag = 0;
pre_node = cur_node;
InThread( cur_node->m_rchild, pre_node ); //右子树线索化
}//if !cur_node
}