您好,登錄后才能下訂單哦!
線索二叉樹它解決了無法直接找到該結點在某種遍歷序列中的前趨和后繼結點的問題,出現了二叉鏈表找左、右孩子困難的問題,線索二叉樹又分為前序線索化,中序線索化和后序線索化,分別用不同的邏輯去實現。
線索二叉樹的實現思想:借用一個枚舉類型tag其中包含兩個狀態Link(代表有數據),thread(代表下一個節點為空)在一個節點的左節點或者右節點為空的情況下,將它的left或right設為thread,則它的左或右訪問的是改遍歷模式下訪問到的下一個節點數據,這樣就完成了跳到另一顆子樹的過程,減少了遞歸的次數。
先序線索化
void _PrevorderThreading(BinaryTreeXsh<T> *cur, BinaryTreeXsh<T> *&prev) { if (cur == NULL) { return; } if (cur->_leftnode==NULL) { cur->_LeftTag=THREAD; cur->_leftnode=prev; } if (prev&&prev->_rightnode==NULL) { prev->_RightTag = THREAD; prev->_rightnode = cur; } prev = cur; if (cur->_LeftTag == LINK) { _PrevorderThreading(cur->_leftnode, prev); } if (cur->_RightTag == LINK) { _PrevorderThreading(cur->_rightnode, prev); } }
中序線索化
void _InorderThreading(BinaryTreeXsh<T>* root, BinaryTreeXsh<T> *&prev) { BinaryTreeXsh<T>*cur = root; if (cur == NULL) { return; } _InorderThreading(cur->_leftnode, prev); if (cur->_leftnode == NULL) { cur->_LeftTag = THREAD; cur->_leftnode = prev; } if (prev&&prev->_rightnode == NULL) { prev->_RightTag = THREAD; prev->_rightnode = cur; } prev = cur; _InorderThreading(cur->_rightnode, prev); }
后序線索化
void _PostorderThreading(BinaryTreeXsh<T>*root, BinaryTreeXsh<T>*&prev) { BinaryTreeXsh<T>*cur = root; if (cur == NULL) { return; } _PostorderThreading(cur->_leftnode, prev); _PostorderThreading(cur->_rightnode, prev); if (cur->_leftnode==NULL) { cur->_LeftTag = THREAD; cur->_leftnode = prev; } if (prev&&prev->_rightnode == NULL) { prev->_RightTag = THREAD; prev->_rightnode = cur; } prev = cur; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。