c 二叉樹的線索化

2021-07-23 19:29:31 字數 2465 閱讀 2572

什麼是二叉樹的線索化?或者問什麼是線索二叉樹?

按照某種遍歷方式對

二叉樹進行遍歷,可以把二叉樹中所有結點排序為乙個

線性序列

。在改序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點;除最後乙個結點外每乙個結點有且僅有乙個直接後繼結點。這些指向直接前驅結點和指向直接後續結點的指標被稱為線索(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...