線索二叉樹

2022-08-21 11:51:09 字數 989 閱讀 2442

我們對乙個二叉樹進行中序排列後可以獲得二叉樹的中序序列。但這種資訊只能在遍歷的動態過程中才能獲得。如果我們在每個節點中加入前驅和後繼指標倒是可以直接儲存下每個節點的前驅和後繼。

但這樣一來對於有n個節點的二叉樹又增加了2n個指標,對空間的使用效率又降低了。如何解決這個問題?

我們可以發現,在有n個節點的二叉樹中必定有n+1個空指標,我們可以利用這些空指標來儲存前驅和後繼的資訊。

對二叉樹以某種次序遍歷使其變為線索二叉樹的過程叫做線索化。其規則如下:

1.若節點的左子樹為空,則該節點的左指標指向其前驅節點。

2.若節點的右子樹為空,則該節點的右指標指向其後繼節點。

其中,指向前驅和後繼的指標叫做線索。加上線索的二叉樹叫做線索二叉樹。

但我們如何區分乙個線索二叉樹的指標到底是指向前驅後繼還是指向子樹呢?為解決這一問題,我們在節點中新增標誌位ltag和rtag。其定義如下:

1.ltag為0時,left指標指向左子樹,為1時指向前驅節點。

2.rtag為0時,right指標指向右子樹,為1時指向後繼節點。

這樣我們就能直接遍歷線索二叉樹了。

//線索二叉樹的宣告

typedef enum threadtag;

typedef struct _thrbinbode thrbinnode;

//線索二叉樹的遍歷

void thrbintreeinorder(thrbinnode * pbtn, void(*pfun)(item *))

pbtn = pbtn->right;

}}

線索二叉樹

當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在n個結點的二叉鍊...

線索二叉樹

1.線索二叉樹結構和操作定義 threadbintree.h 功能 線索標誌域所有值 typedef enumnodeflag 功能 線索二叉樹結構體 typedef struct threadtreethreadbintree 前驅節點指標 threadbintree previous null ...

線索二叉樹

原始碼 中序線索二叉樹 author 菜鳥 version 2014.7.23 include include include typedef char datatype using namespace std 定義線索二叉樹的結構體 typedef struct nodethreadbitreen...