線索二叉樹

2021-07-25 16:44:59 字數 1715 閱讀 4987

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

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

typedef

struct threadnode threadnode, *threadtree;

//其中

//ltag = 0 表示lchild指示節點的左孩子

//ltag = 1 表示lchild指示節點的前驅

//rtag同理

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

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

以d為例,作為說明:在中序中,d在遍歷序列中的前驅是b,而a是後繼,所以d原本兩個為null的指標分別指向了它的前驅b和後繼a。

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

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...