什麼是二叉樹的線索化?或者問什麼是線索二叉樹?
按照某種遍歷方式對
二叉樹進行遍歷,可以把二叉樹中所有結點排序為乙個
線性序列
。在改序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點;除最後乙個結點外每乙個結點有且僅有乙個直接後繼結點。這些指向直接前驅結點和指向直接後續結點的指標被稱為線索(thread),加了線索的二叉樹稱為線索二叉樹。
以上是搜狗百科的一段文字,反正我是沒看太懂。簡單點,以我的理解,線索二叉樹就是充分利用了二叉樹結點中的空指標,讓它們分別指向本結點的前驅或者後繼。既充分利用了資源,又可以讓我們方便遍歷這棵樹。
什麼是二叉樹結點的空指標?
我們先看一棵樹。圖中的結點3,4,6的左右指標,結點5的右指標等類似指標都為空指標。
什麼又叫讓這些空指標指向本節點的前驅或者後繼呢?
這個問題分為3中情況,前序,中序,後序。例如上圖中的樹前序遍歷序列為1,2,3,4,5,6。這樣,我們就可以讓結點3的左指標指向它的前驅2,結點3的右指標指向它的後繼4。讓結點4的左指標指向4的前驅3,讓結點4的右指標指向4的後繼5。結點5的左不為空,所以不操作。結點5的右為空,讓結點5的右指向5的後繼6。結點6的左右都為空,讓結點6的左指標指向6的前驅5,因為6為最後乙個元素,6的後繼為空,所以讓結點6的右指標指向空。
讓我們把指標重置後的圖畫出來:
類似的,後序與中序我就不再細說,這裡把**給大家,一看便知。
我建議大家親自動手把這3個圖畫一下,有奇效!!!!!!!
道理大家都懂了,那麼**該如何寫呢? 答案:遞迴。
線索二叉樹的結點定義和普通二叉樹的結點定義不一樣,我們額外需要兩個標誌_lefttag和_righttag。
enum type
;templatestruct binarytreenode
binarytreenode()//預設建構函式
{}};
我們用type型別的_lefttag來標識左指標,當_lefttag等於thread時,表明這個指標已經被線索化(例圖中紫色指標)。當_lefttag等於link時,表明這個指標沒有被線索化,是普通的二叉樹指標(例圖中紅色指標)。
遞迴**:
前序
//前序線索化
void _prevorder_thd(node* _root)
if (prev && !prev->_right)
prev = _root;
if (_root->_lefttag == link)
_prevorder_thd(_root->_left);
if (_root->_righttag == link)
_prevorder_thd(_root->_right);
}}
中序
//中序線索化
void _inorder_thd(node* _root)
if (!_root->_left)
if (prev && !prev->_right)
prev = _root;
if (_root->_righttag == link)}}
後序
//後序線索化
void _postorder_thd(node* _root)
static node* prev = null;
_postorder_thd(_root->_left);
_postorder_thd(_root->_right);
if (!_root->_left)
if (prev && !prev->_right)
prev = _root;
}
最後,來說一下今年的一道面試題,如何將乙個二叉樹轉化成乙個有序的雙向鍊錶?
在你沒學線索化之前,這道題可能很麻煩。但是現在不同了,利用中序線索化的思想可以很快將這道題解出來!
//利用中序線索化思想將搜尋二叉樹轉換成有序的雙向鍊錶
void _treetolist(node* _root)
_treetolist(_root->_left);//遞迴左子樹
_root->_left = prev;//讓當前結點的左指標指向上一次訪問的結點,即前驅。
if (prev)
prev = _root;//更新prev
_treetolist(_root->_right);//遞迴右子樹
}
(C )二叉樹的線索化 線索二叉樹
線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...
線索化二叉樹以及遍歷線索化二叉樹
1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...
線索化二叉樹
define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...