二叉樹的線索化,這幾天以來我很難掌握,今天終於想通了,哈哈,首先我們來看看二叉樹線索化之後會變成什麼樣子,這裡我們以圖中的二叉樹為例,圖如下:
畫的太糙,各位看官講究著看吧- -。所謂二叉樹的線索化,就是當乙個節點的左右指標為空時,就讓它的左右指標指向該節點的前驅或者後繼(一般來說左指標指向前驅,右指標指向後繼)。這裡不論指向前驅或者後繼,我們都應該線索化時,至少要明確兩個節點指標的值,當前節點和當前節點的前驅/後繼。這也是線索化的兩種思路:
儲存前驅:訪問當前節點時若當前節點的左指標為空,則令左指標指向前驅,若前驅的右指標為空,則令前驅的右指標指向當前節點,**描述如下:
void visit(node* cur,node* &prev)//當前指標的前驅在當前指標訪問時會改變,故傳引用用來改變//prev
這裡我們要注意的是應該先進行訪問,最後再改變prev的值。
儲存後繼:這種方法很難做到,並且個人覺得沒有什麼意義,因為在遍歷整個數的過程中我們始終都會訪問到乙個節點的後繼,若將要訪問後繼那我們如何儲存到未來的東西,即使通過類似棧的資料結構通過壓棧來強行訪問,效率也是不高的,在此不推薦。
接下來獻上c++完整的線索二叉樹結構以及中序線索化過程,通過遞迴與非遞迴兩種方式實現,其他的都大同小異。
節點類定義如下:
typedef char datatype;
enum nodetype
;struct theardbinarytreenode
theardbinarytreenode()
: _left(null)
, _right(null)
, _lefttag(link)
, _righttag(link)
,_data((datatype)0)
{}};
中序線索化如下:
void intherad()
// node* top = s.top();
// s.pop();
// if (top->_left == null&&top->_lefttag == link)
// // prev = top;
// if (top->_right == null&&top->_righttag==link)
// // else
// cur = top->_right;
//}} void _intherad(node*root, node* &prev)//遞迴的中序線索化
if (root->_lefttag == link&&root->_left == null)
_intherad(root->_right,prev);
}
本文出自 「pawnsir的it之路」 部落格,請務必保留此齣 線索二叉樹的線索化演算法
在嚴蔚敏的 資料結構 一書中,所使用的 存在一些小問題。原版 就不附上了,主要問題是 1.inthreading函式的引數,應該攜帶pre,這應該是比較嚴重的問題。如果沒有攜帶pre,則對pre的修改只是在呼叫的函式中的區域性變數的值的修改,沒有影響到原來的pre的值。2.在條件語句中,將命中概率高...
(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...