線索二叉樹

2021-09-11 19:05:53 字數 922 閱讀 3707

線索二叉樹提出的原因:

在普通二叉樹中,每個結點都有左右兩個指標域,這些指標域都指向結點型別的資料物件,當二叉樹稀疏時,很多結點的左右兩個指標域就顯得浪費儲存空間了。因此,提出了一種方法以提高空間利用率,令原來二叉樹結點的空指標指向這棵二叉樹在某種遍歷序列中的前驅結點或後繼結點,此時稱這個指向某種遍歷序列中的前驅或後繼結點的指標為線索。

例如,在某棵二叉樹的先序遍歷序列中,針對某個結點node:

(1)如果node.lchild為空,則node.lchild存放指向先序遍歷序列中該結點的前驅結點。這個結點稱為node的先序前驅;

(2)如果node.rchild為空,則node.rchild存放指向先序遍歷序列中該結點的後繼結點。這個結點稱為node的先序後繼。

顯然,在決定lchild是指向左孩子還是前驅,rchild是指向右孩子還是後繼,需要乙個區分標誌的。因此,我們在每個結點再增設兩個標誌域ltag和rtag,注意ltag和rtag只是區分0或1數字的布林型變數,其占用記憶體空間要小於像lchild和rchild的指標變數。結點結構如下所示。

其中:(1)ltag為0時指向該結點的左孩子,為1時指向該結點的前驅;

(2)rtag為0時指向該結點的右孩子,為1時指向該結點的後繼;

結點類的設計可以是這樣的:

下面是先序線索二叉樹的示意圖:

類似的還有中序、後序線索二叉樹等。

線索化的實質就是將二叉鍊錶中的空指標改為指向前驅或後繼的線索。由於前驅和後繼資訊只有在遍歷該二叉樹時才能得到,所以,線索化的過程就是在遍歷的過程中修改空指標的過程。

參考博文

線索二叉樹

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