線索二叉樹它解決了無法直接找到該結點在某種遍歷序列中的前趨和後繼結點的問題,出現了二叉鏈表找左、右孩子困難的問題,線索二叉樹又分爲前序線索化,中序線索化和後序線索化,分別用不同的邏輯去實現。
線索二叉樹的實現思想:借用一個枚舉類型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;
}
本文出自 “痕跡” 博客,請務必保留此出處http://wpfbcr.blog.51cto.com/10696766/1761955