二叉树的线索化

遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列即是对一个非线性结构进行线性化操作,使除第一个和最后一个节点外,每一个节点有且只有一个直接前驱,直接后继

二叉树作为存储结构只能找到节点的左孩子右孩子信息,而不能直接得到结点在任一序列中的前驱和后继,这种信息只有在遍历的动态过程中可以看到。

二叉树线索化可以利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息可以使用以下结点结构:

 enum pointertag{ Link, Thread };
template<class T>
struct BinaryTreeNode
{
 T _data;
 BinaryTreeNode<T>* _left;
 BinaryTreeNode<T>* _right;
 pointertag _lefttag, _righttag;
 BinaryTreeNode(const T&x)
  :_data(x)
  , _left(NULL)
  , _right(NULL)
  , _lefttag(Link)
  , _righttag(Link)
 {}
};

1、二叉树的中序线索化

 

void _InOrderThding(BinaryTreeNode<T>*cur, BinaryTreeNode<T>*&prev)
    {
        if (cur == NULL)
            return;
        _InOrderThding(cur->_left, prev);//左子树
        if (cur->_left == NULL)//当节点的左孩子为空时线索化
                               
        {
            cur->_lefttag = Thread;
            cur->_left = prev;
        }
        if (prev&&prev->_right == NULL)//当线索化结点3的后继时,由于指向根节点2,即当前cur指向的结点      
{ prev->_righttag = Thread; prev->_right = cur; } prev = cur;//prev记录cur上一个指向的结点 _InOrderThding(cur->_right, prev);//右子树 }


2、二叉树的前序线索化

void _PrevOrderThding(BinaryTreeNode<T>*cur, BinaryTreeNode<T>*&prev)
    {
        if (cur == NULL)
            return;
        
        if (cur->_left == NULL))//当cur->_left为空时,_lefttag的状态变为Thread,进行线索化
        {
            cur->_lefttag = Thread;
            cur->_left = prev;
        }
        if  (prev&&prev->_right == NULL)
        {
            prev->_righttag = Thread;
            prev->_right = cur;
        }
        prev = cur;
        if (cur->_lefttag == Link)//只有当结点的_lefttag的状态为link时,需要递归线索化左子树 2、 3的_lefttag==Thread,即不用进入此递归    
{
_PrevOrderThding(cur
->_left, prev);
1、cur->_left为3
}
if (cur->_righttag == Link)//3、3的_righttag为Link进入,3的右子树为NULL此层循环return,cur指向结点2,prev指向结点3 { _PrevOrderThding(cur->_right, prev); }

3、二叉树的后序线索化

void _PostOrderThding(BinaryTreeNode<T>*cur, BinaryTreeNode<T>*&prev)
    {
        if (cur == NULL)
            return;
        _PostOrderThding(cur->_left, prev);
        _PostOrderThding(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;
        
    }
原文地址:https://www.cnblogs.com/Blog-day/p/My_Blog_Days_17.html