當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左、右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左、右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。
我們可以證明:在n個結點的二叉鍊錶中含有n+1個空指標。因為含n個結點的二叉鍊錶中含有個指標,除了根結點,每個結點都有乙個從父結點指向該結點的指標,因此一共使用了n-1個指標,所以在n個結點的二叉鍊錶中含有n+1個空指標。
因此可以利用這些空指標,存放指向結點在某種遍歷次序下的前驅和後繼結點的指標。這種附加的指標稱為線索,加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹。為了區分乙個結點的指標是指向其兒子的指標,還是指向其前驅或後繼結點的線索,可在每個結點中增加兩個線索標誌。這樣,線索二叉樹結點型別定義為:
type
tposition=^thrnodetype;
thrnodetype=record
label:labeltype;
ltag,rtag:0..1;
leftchild,rightchild:tposition;
end;
其中ltag為左線索標誌,rtag為右線索標誌。它們的含義是:
例如圖13(a)是一棵中序線索二叉樹,它的線索鍊錶如圖13(b)所示。
(a)(b)
圖13 線索二叉樹及其線索鍊錶
圖13(b)中,在二叉樹的線索鍊錶上增加了乙個頭結點,其leftchild指標指向二叉樹的根結點,其rightchild指標指向中序遍歷時的最後乙個結點。另外,二叉樹中依中序列表的第乙個結點的leftchild指標,和最後乙個結點的rightchild指標都指向頭結點。這就像為二叉樹建立了乙個雙向線索鍊錶,既可從第乙個結點起,順著後繼進行遍歷,也可從最後乙個結點起順著前驅進行遍歷。
線索二叉樹
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...
線索二叉樹
今天,我們一起用c 實現一顆線索二叉樹,具體 如下 threadinorderiterator.h具體內容如下 cpp view plain copy include threadtree.h template typename type class threadinorderiterator th...