在二叉鍊錶中,我們只知道每個結點指向其左右孩子結點的位址,而不知道每個結點的前驅後繼。要想知道,必須遍歷一次。為了避免這種情況,我們可以建立指向前驅和後繼的指標。這種指向前驅和後繼的指標稱為線索,加上線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹就被稱為線索二叉樹。
可以看出,其實線索二叉樹等於是把一顆二叉樹轉變成了乙個雙向鍊錶。然而這樣又存在著問題,無法區分某一結點的lchild是指向它的左孩子還是指向它的前驅,某一結點的rchild是指向它的右孩子還是指向它的後繼。因此,在每個結點中再增設兩個標誌域,ltag以及rtag。
線索二叉樹的結構**如下:
/* 二叉樹的二叉線索儲存結構定義 */
typedef enum pointertag;
/* link==0表示指向左右孩子指標,thread==1表示指向前驅或者後繼的線索 */
typedef struct bithrnode //二叉線索儲存結點結構
bithrnode, *bithrtree;
線索化的實質就是將二叉鍊錶中的空指標改為前驅或者後繼的線索。線索化的過程就是在遍歷時修改空指標的過程。
中序遍歷線索化的遞迴函式**如下:
bithrtree pre; //全域性變數,始終指向剛剛訪問過的結點
void inthreading(bithrtree p)
if(!pre->child) /* 沒有右孩子 */
pre = p; //保持pre指向p的前驅
inthreading(p->rchild); //遞迴右子樹線索化}}
線索二叉樹
當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在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...