1. 程式人生 > >二叉搜尋樹(二叉穿線樹)抽象結構以及線索化演算法

二叉搜尋樹(二叉穿線樹)抽象結構以及線索化演算法

//二叉線索樹
//每個節點儲存了它在某種遍歷順序下的前驅和後繼節點的位置,所以Node類中需要新增
//preLink和nextLink兩個指標,但是在中序遍歷下,可以把未被利用的n+1個指標域用
//上來存下一訪問節點的位置,但是需要增加leftTag和rightTag兩個標記量區分是指向
//孩子還是指向遍歷的前驅和後繼

//Node類的資料型別
class ThreadNode{
public:
    bool leftTag;
    bool rightTag;
    ThreadNode* lLink;
    ThreadNode* rLink;
    int item;
public:
    ThreadNode() = default;
    ThreadNode(int a);
};
ThreadNode::ThreadNode(int a) {item = a;
leftTag = rightTag = 0;
lLink = rLink = nullptr;}

//ThreadBinaryTree類
//這裡構造方法和普通二叉樹一樣,直接一點一點連就好了
class ThreadBinaryTree{
public:
    ThreadNode root;
public:
    ThreadBinaryTree() = default;
    ThreadBinaryTree(ThreadNode*);
    void InOrder(ThreadNode * _root);
    void InThread(ThreadNode *_root, ThreadNode* & pre);//線索化中序二叉樹
};

//線索化二叉樹
void ThreadBinaryTree::InThread(ThreadNode * _root,ThreadNode* & pre)//pre在函式遞迴呼叫的時候要保持
{
    if(_root!= nullptr)
    {
        InThread(_root->lLink, pre);
        if(_root->lLink == nullptr)
        {
            _root->lLink = pre;
            _root->leftTag = 1;
        }
        if(pre && pre->rLink == nullptr)
        {
            pre->lLink = _root;
            pre->rightTag = 1;
        }
        pre = _root;
        InThread(_root->rLink, pre);
    }
}