二叉樹的中序線索樹 資料結構 線索二叉樹

2021-10-12 07:54:09 字數 1032 閱讀 3435

1.引入線索二叉樹

二叉樹的遍歷實質上是對乙個非線性結構實現線性化的過程,使每乙個節點(除第乙個和最後乙個外)在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存結構中,只能找到乙個節點的左、右孩子資訊,而不能直接得到節點在任一遍歷序列中的前驅和後繼資訊。這些資訊只有在遍歷的動態過程中才能得到,因此,引入線索二叉樹來儲存這些從動態過程中得到的資訊。

2.建立線索二叉樹

為了儲存節點在任一串行中的前驅和後繼資訊,可以考慮在每乙個節點中增加兩個指標域存放遍歷時得到的前驅和後繼資訊,這樣就可以為以後的訪問帶來方便。但增加指標資訊會降低儲存空間的利用率,因此可考慮採用其他辦法。

若n個節點的二叉樹採用二叉鍊錶作儲存結構,則鍊錶中必然有n+1個空指標域,可以充分利用這些空指標域來存放節點的前驅和後繼資訊。

3.訪問線索二叉樹

以中序線索二叉樹為例,令p所指節點的某個節點。查詢p所指節點的後繼點的方法:

(1)若p->rtag==1,則p->rchild指向其後繼節

(2)若p->rtag==0,則p所指節點的中序後繼必然是其右子樹中進行中序遍歷時得到的第乙個節點。也就是說,從p所指節點的右子樹的根節點出發,沿左孩子指標鏈向下查詢,直到找到乙個沒有左孩子的節點時為止,這個節點就是p所指節點的直接後繼節點,也稱其為p的右子樹中」最左下」的節點。

以中序線索二叉樹為例,令p所指節點的某個節點。查詢p所指節點直接前驅方法:

(1)若p->ltag==1,則p->lchild指向其前驅節點

(2)若p->ltag==0,則p所指節點的中序前驅必然是其右子樹中進行中序遍歷時得到的最後乙個節點。也就是說,從p所指節點的右子樹的根節點出發,沿右孩子指標鏈向下查詢,直到找到乙個沒有右孩子的節點時為止,這個節點就是p所指節點的直接前驅節點,也稱其為p的右子樹中」最右下」的節點。

資料結構 線索二叉樹(中序線索二叉樹及遍歷)

二叉樹的遍歷是按照一定的規則把二叉樹中的節點按照一定的次序排列成線性序列進行訪問的,實質上就是對乙個非線性結構進行線索化操作,使得每個節點 除第乙個和最後乙個外 都有前驅 和後繼節點,有時為了運算方便需要記錄這些前驅和後繼節點,稱為二叉樹線索化,而對於不同的遍歷規則,又分為先序線索二叉樹,中序線索二...

資料結構 中序線索二叉樹

所謂線索二叉樹無非是為了讓原本指向null的節點指向乙個詳細的 已經存在的節點,邏輯上實現指標的無空指向的實現。以下是我中 序線索二叉樹的實現。還是把先序線索二叉樹與後序線索分開來寫吧。include using namespace std template struct node template...

中序線索二叉樹

就是在中序遍歷的時候加上線索,為了區分線索和孩子,要多加兩個標誌變數ltag,rtag如果標誌為true就表明是線索,如果為false就表示孩子 一般規定是將做指標為空的指標域用來存放直接前驅 將有指標為空的指標域用來存放直接後繼 當然如果不為空的話就不會用來存放前後繼,而是孩子了 意思就是存放前繼...