二叉樹的線索化演算法思想詳解

2021-07-12 04:01:23 字數 1500 閱讀 8679

二叉樹的線索化,這幾天以來我很難掌握,今天終於想通了,哈哈,首先我們來看看二叉樹線索化之後會變成什麼樣子,這裡我們以圖中的二叉樹為例,圖如下:

畫的太糙,各位看官講究著看吧- -。所謂二叉樹的線索化,就是當乙個節點的左右指標為空時,就讓它的左右指標指向該節點的前驅或者後繼(一般來說左指標指向前驅,右指標指向後繼)。這裡不論指向前驅或者後繼,我們都應該線索化時,至少要明確兩個節點指標的值,當前節點和當前節點的前驅/後繼。這也是線索化的兩種思路:

儲存前驅:訪問當前節點時若當前節點的左指標為空,則令左指標指向前驅,若前驅的右指標為空,則令前驅的右指標指向當前節點,**描述如下:

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...