先簡要說下什麼線索化
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。由於有n個結點的二叉鍊錶中必定存在n+1個空指標域,因此充分利用這些空指標域來存放結點的前驅和後繼資訊。
本篇主要介紹二叉樹的前序和中序線索化以及遍歷,下篇介紹後序線索化以及遍歷
線索化二叉樹結點:
enum info //存放標誌
;templatestruct binarytreenodethd
t _data;
binarytreenodethd* _pleft;
binarytreenodethd* _pright;
binarytreenodethd* _pparent;
info _leftthread;
info _rightthread;
};
結點預設的左右線索標誌符為link, 當需要線索化時改為thread,
首先建立二叉樹:採用前序的方式建立
binarytreethd()
:_proot(null)
binarytreethd(t array, size_t size)
:_proot(null)
private:
void _creatbinarytree(binarytreenodethd*& proot, t array, size_t size, size_t& index)
}
由於線索化二叉樹構造的實質是將二叉鍊錶的中空指標域改為指向前驅或後繼的線索,而前驅或後繼的資訊只有在遍歷的時候才能得到,因此線索化的過程即為在遍歷的過程中修改空指標域的過程,可用遞迴演算法。
先序線索化以及遍歷 :
假設當前節點沒有右孩子,需要線索化,但是此時還沒有遍歷到下乙個訪問的結點,怎麼解決這個情況呢?
用乙個結點prev來儲存前一次遍歷結點的資訊,把需要線索化的後繼放到訪問下乙個結點時來線索化,
即線索化prev的後繼
思路:(1)線索化當前節點的左孩子和右孩子
(2)線索化左子樹
(3)線索化右子樹
上**:
void prethread()
void _prethread(binarytreenodethd* proot, binarytreenodethd*& prev)
//線索化當前節點的前繼節點的右指標域
if (prev && null == prev->_pright)
prev = proot;
if (link == proot->_leftthread)
_prethread(proot->_pleft, prev);
if (link == proot->_rightthread)
_prethread(proot->_pright, prev);
} }
前序線索化遍歷:
(1)找到最左邊的結點,順便訪問過程中的結點
(2)訪問當前結點的後繼或者右孩子
void _preorder(binarytreenodethd* proot) //前序遍歷 0136425
//此時pcur為最左邊的節點還沒有訪問
cout << pcur->_data << " ";
//處理右孩子
pcur = pcur->_pright;
}cout << endl;
}
中序線索化以及遍歷:
中序 線索化:(1)線索化左子樹
(2)線索化結點的左右孩子
(3)線索化右子樹
void inthread()
void _inthread(binarytreenodethd* proot, binarytreenodethd*& prev)
if (prev && null == prev->_pright)
prev = proot;
if (link == proot->_rightthread) //因為結點已經被線索化過了,
_inthread(proot->_pright, prev);
} }
中序遍歷:
貼**:
void _inorder(binarytreenodethd* proot) //3614052
//訪問當前節點
cout << pcur->_data << " ";
//訪問當前節點的後繼
while (pcur && pcur->_rightthread == thread) //注意左單支 pcur為空
//沒有後繼,有右子樹
if (pcur)
}}
線索化二叉樹以及遍歷線索化二叉樹
1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...
線索化二叉樹(前序線索化,中序線索化)
為什麼要對二叉樹進行線索化?對二叉樹進行遍歷是以一定的規則將二叉樹的節點排列成乙個線性序列,這些線性序列有且僅有乙個直接前驅和直接後繼,但是以二叉鍊錶進行儲存的時候,只能找到節點的左右孩子資訊,不能直接得到節點在任一串行的前驅和後繼資訊,前驅和後繼資訊只能在遍歷的動態過程中才能得到。如何獲取到前驅和...
線索二叉樹的定義 結構以及線索化
1 線索二叉樹的基本概念 在二叉樹的每個結點中增加兩個指標域,用於存放遍歷二叉樹時得到的直接前驅和直接後繼的資訊。2 線索二叉樹的結點構造 ltag 0時,表示lchild指向結點的左孩子,lchild是乙個指標 結點有左孩子 ltag 1時,表示lchild指向結點的直接前驅,lchild是乙個線...