線索二叉樹

線索二叉樹實質(zhì)上就是將一顆二叉樹轉(zhuǎn)化成二叉鏈表的過程,將二叉樹的一些空指針給利用起來,為了達(dá)到這個目的,我們使用中序遍歷線索化的辦法。

也就是要將每個節(jié)點的指針全部存儲一個值,為了區(qū)分線索和真正的子節(jié)點,我們就需要一個flag,將線索和子節(jié)點區(qū)分開來,具體代碼如下。

#define thread 1
#define child 0

//我們將原本的節(jié)點擴(kuò)充一下,來區(qū)分指針存儲的是什么
struct treeNode
{
    int data;
    treeNode* lChild;
    treeNode* rChild;
    int lTag;
    int rTag;
};

//定義一個全局變量,指向上一次遍歷過的節(jié)點
//我們需要在每次遞歸線索化的時候改變這個值
//也可以不需要全局變量,改用引用
treeNode* preNode;

//中序線索化二叉樹
void cueingTree(treeNode* node)
{
    if(node != NULL)
    {
        cueingTree(node->lChild);
//如果當(dāng)前節(jié)點的左子樹節(jié)點是為NULL,則說明它可以用來存放這個節(jié)點的前驅(qū)
//即上次遍歷過的節(jié)點
        if(node->lChild == NULL)
        {
            node->lTag = thread;
            node->lChild = preNode;
        }
//如果上個節(jié)點的右子樹為NULL,說明可以存放這個節(jié)點的后繼
//只有在知道了后繼之后才能為前一個節(jié)點賦值
        if(preNode->rChild == NULL)
        {
            preNode->rTag = thread;
            preNode->rChild = node;
        }
//更新上次遍歷過的節(jié)點
        preNode = node;
        if(node->rChild != node)
        {
            cueingTree(node->rChild);
        }
    }
}

//在有了線索二叉樹之后,我們便可以使用迭代的方式來遍歷二叉樹
void inOrderTraversal()
{
    treeNode* currentNode = this->head->lChild;
    while(currentNode != this->head)
    {
        while(currentNode->lTag == child)
        {
            currentNode = currentNode->lChild;
        }
        cout << currentNode->data << "  ";
        while(currentNode->rTag == thread && currentNode->rChild != this->head)
        {
            currentNode = currentNode->rChild;
            cout << currentNode->data << "  ";
        }
        currentNode = currentNode->rChild;
    }
}

其實線索二叉樹的建立過程,就是一次中序遍歷的過程,在遍歷過程中,對每一個節(jié)點進(jìn)行線索化,如果有能利用到的空指針,就可以用來存放前驅(qū)后繼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原鏈接:理解線索二叉樹|CloudWong 線索二叉樹原理 遍歷二叉樹的其實就是以一定規(guī)則將二叉樹中的結(jié)點排列成一...
    簡Cloud閱讀 8,570評論 1 16
  • 數(shù)據(jù)結(jié)構(gòu)與算法--線索二叉樹及其前序、中序遍歷 二叉樹如果某個結(jié)點沒有左孩子或右孩子,則這個域就為空。如node....
    sunhaiyu閱讀 2,906評論 4 16
  • 線索二叉樹的原理 通過考察各種二叉鏈表,不管兒叉樹的形態(tài)如何,空鏈域的個數(shù)總是多過非空鏈域的個數(shù)。準(zhǔn)確的說,n各結(jié)...
    葛高召閱讀 839評論 0 0
  • 線索二叉樹的原理 通過考察各種二叉鏈表,不管兒叉樹的形態(tài)如何,空鏈域的個數(shù)總是多過非空鏈域的個數(shù)。準(zhǔn)確的說,n各結(jié)...
    Gaizka閱讀 654評論 0 0
  • 線索二叉樹的原理 通過考察各種二叉鏈表,不管兒叉樹的形態(tài)如何,空鏈域的個數(shù)總是多過非空鏈域的個數(shù)。準(zhǔn)確的說,n各結(jié)...
    少帥yangjie閱讀 358評論 0 1

友情鏈接更多精彩內(nèi)容