二叉樹遍歷,這實質上是對乙個非線性結構進行線性化操作,使每個結點(除第乙個和最後乙個外)在這些線性序列中有且僅有乙個直接前驅和直接後繼。
遍歷二叉樹是以一定規則將二叉樹中的結點排列成乙個線性序列,得到二叉樹中結點的先序序列、中序序列或後續序列。
當以二叉鍊錶作為儲存結構時,只能找到結點的左右孩子資訊,而不能直接得到結點在任一串行中的前驅和後繼資訊,這種資訊只有在遍歷的動態過程中才能得到。
如何儲存這種在遍歷過程中得到的資訊呢?
乙個最簡單的方法是在每個節點上增加兩個指標域,分別指示結點在遍歷時得到的前驅和後繼資訊。顯然,這樣做使得結構的儲存密度大大降低。
另一方面,存在有n個結點的二叉鍊錶中必定存在n+1個空鏈域。
為什麼會有n+1個空鏈域呢?
如果結點總數為n, n2為度為2的結點樹,n1為度為1的結點數,n0為度為0的結點數。n=n0+n1+n2 且 遵循乙個公式 n0=n2+1
假設空鏈域的個數為 x , 以二叉鍊錶的資料結構來說:
x = 2*n0 + 1*n1 即 葉子結點有左右兩個空域,度為1的結點有左或者右域,度為2的結點沒有多餘的域!
x= n0+n1+n0 = n0 + n1 + n2 +1 = n + 1 故有 n+1個空鏈域
由此設想能否利用這些空鏈域來存放結點的前驅和後繼的資訊。把這種指向前驅和後繼的指標稱為線索,加上線索的二叉鍊錶成為線索鍊錶,相應的二叉樹就稱為線索二叉樹(threaded binary tree)
線索二叉樹的資料結構為:增加了兩個標誌域 leftthread和rightthread
leftchild leftthread data rightthread rightchild
若leftthread=0,則leftchild為左子女指標,否則為前驅線索,同理rightthread
線索二叉樹
當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在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...