Threaded Binary Tree(1/3)

hono Yang
Jun 30, 2021

--

Threaded Binary Tree實作是我想寫Binary Tree的原因,因為這個題目有夠坑,書中的說明少了一個步驟,聖經本(基礎資料結構使用c++)更是形而上,看youtube也是直接跳步驟的一堆。

看完真心累。

Threaded Binary Tree中文譯為引線二元樹。
一般二元樹的走訪最常見的就是利用遞迴來走訪。如果能用是linked list的走訪感覺對節點的操作就會更直覺一點,引線二元樹就是想做到這樣的效果。這裡說是像,但還是會有點不同

名詞介紹:
Successor: 後繼者 — -讓每個Node能連結到下一個節點
Predecessor:前驅者 — -讓每個Node能連結到上一個節點

下圖為一個二元樹例,其中序走訪的順序為HDIBJEAFCG

例如H、I、J右子樹都是空的,可以加以利用,原本H的右子樹指向Null,現在把它們的右子樹連結到下一個Node去,這樣Tree就可以一個接一個的走訪,如下圖。

將樹進行Successor化,讓樹的節點能找到後繼者是誰,紅色的這些線就稱為thread。

這裡也是名詞定義下。若Node是有實際的左或右子樹,則此pointer稱為link(例如B指向D的pointer),若是將左或右子樹指向後繼者,則此pointer稱為thread(例如J指向E的pointer)。

當初初讀時,以為真的可以向linked list這樣,從H開始一路next->next->next->…….一直指到G。

BUT!!!這棵樹的中序走訪是HDIBJEAFCG,B的下一個後繼者應該是J啊,但實際上再看看圖就會發現,B明明下一個就是指向E。

也就是說這個Threaded Binary Tree,是讓你有方法比較快找到下個後繼者,而不是讓你變成真正的linked list走訪。

例如,B如果要找到後繼者,他會發現自己的右子樹是連結到真正的結點E,所以他的右子樹pointer不能利用來指向中序走訪的後進者,也就是J,必需要繞一下路才能找到J,之後再說明。

因此,在Threaded Binary Tree的資料結果除了二元樹的基本資料結構(data、lchild、rchild),還多加了LTag和RTag,這個變數是用來記錄,左子樹/右子樹所連結的是link還是thread。

以上講的是Successor,後繼者。但如同雙向鏈結一樣,我可以從頭走到尾,也可以從尾走到頭,Predecessor:前驅者。是同樣的概念。

以下為Threaded Binary Tree的資料結構

這裡小結一下,Threaded Binary Tree包含了兩個步驟:

  1. 連結引線
  2. 走訪

這兩個要分開來看。

本篇就先介紹到這

--

--