線索二叉樹

2021-08-10 18:16:22 字數 1916 閱讀 5373

線索二叉樹基本概念

二叉樹的遍歷就是以一定的規則將二叉樹中的結點排列成乙個線性序列,從而得到,二叉樹結點的各種遍歷序列。二叉樹遍歷的實質就是對乙個非線性結構進行線性化操作,使在這個訪問序列中每乙個結點(除第乙個和最後乙個)都有乙個直接前驅和直接後繼。

傳統的鏈式儲存只能體現一種父子關係,不能直接得到結點在遍歷中的前驅或後繼。通過觀察,我們發現在二叉鍊錶表示的二叉樹中存在大量的空指標,若利用這些空鏈域存放指向其直接前驅或後繼的指標,便可以更方便地運用某些二叉樹的操作演算法。引入線索二叉樹是為了加快查詢結點前驅和後繼的速度。

在有n個結點的二叉樹中,有n+1個空指標。這是因為每乙個葉子結點有兩個空指標,而每乙個度為1的結點有乙個空指標,總計2n0+n1,又有n0=n2+1,所以,總的空指標為n+1.

線索化

在二叉樹線索化時,通常規定:若無左子樹,令lchild指向其前驅結點;若無右結點,令rchild指向其後繼結點。因此,需要增加兩個標誌域表明當前指標域所指物件是指向左(右)子結點還是直接前驅(後繼)。

其中標誌域的含義:

ltag=0 時lchild指向左子女;

ltag=1 時lchild指向前驅;

rtag=0 時rchild指向右子女;

rtag=1 時rchild指向後繼;

線索二叉樹的儲存結構描述如下:

typedef

struct threadnodethreadnode,*threadtree;

以這種結點結構構成的二叉鍊錶作為二叉樹的儲存結構,叫做線索鍊錶,其中指向結點前驅和後繼的指標,叫做線索。加上線索的二叉樹稱為線索二叉樹。對二叉樹以某種次序遍歷使其變為線索二叉樹的過程稱為線索化

線索二叉樹的構造

對二叉樹的線索化,實質上就是遍歷一次二叉樹,在遍歷過程中,檢查當前結點左、右指標域是否為空,若為空,將它們改為指向前驅結點或後繼結點的線索。

通過中序遍歷對二叉樹線索化的遞迴演算法如下:

void inthread(threadtree &p,threadtree &pre)

if(pre!=

null

&&pre->rchild==

null)

pre=p; //標記當前結點稱為剛剛訪問過的結點

inthread(p->rchild,pre); //遞迴,線索化右子樹}}

通過中序遍歷建立中序線索二叉樹的主過程演算法如下:

void createinthread(threadtree t)

}

線索二叉樹的遍歷中序線索化二叉樹主要是為了訪問運算服務的,這種遍歷不再需要借助棧,因為它的結點中隱含了線索二叉樹的前驅和後繼。利用線索二叉樹,可以實現二叉樹遍歷而非遞迴演算法。不含頭結點的線索二叉樹的遍歷演算法如下:

1.求中序線索二叉樹中中序序列下的第乙個結點

threadnode *firstnode(threadnode *p)
2.求中序線索二叉樹中結點p在中序序列下的後繼結點

threadnode *nextnode(threadnode *p)
3.利用上面兩個演算法,寫出不含頭結點的中序線索二叉樹的中序遍歷演算法

void inorder(threadnode *t)

線索二叉樹

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