1. 程式人生 > >對線索化二叉樹的理解(三)

對線索化二叉樹的理解(三)

上一篇的《理解(二)》中漏掉了一點, 對二叉樹進行線索化的時候,最後pre更新成為樹中最右下角那個葉子節點,這個節點還沒有線索化,需要對他單獨線索化, 在函式最外面 pre->Rtga = Thread; pre->Rchild = NULL; 即可。

這裡簡單說下線索化二叉樹的方法實現:

一、查詢二叉樹中序線索化後的第一個節點:其實就是中序遍歷的最左邊的節點。 放到線索化裡面,就是遞迴左子樹,直到左標記為線索 Ltag = thread 的那個節點。

二、查詢二叉樹中序線索化後的最後一個節點:其實就是中序遍歷的最右變的節點。  放到線索化裡面,就是遞迴右子樹,直到右標記為線索, Rtag = thread的那個節點。

三、查詢某節點的前驅:

(1)如果這個節點有左線索,那前驅就是leftchild;

(2)如果這個節點左標記為Link,那麼按照中序遍歷,這個節點的前驅就是“這個節點的左子樹的最後一個節點”,用上面的方法二即可。

四、查詢某節點的後繼:

(1)如果這個節點有右線索,那後繼就是rightchild;

(2)如果這個節點的右標記為Link,那麼按照中序遍歷,這個節點的後繼就是“這個節點的右子樹的第一個節點”,用上面的方法一即可。

五,根據資料域,查詢某節點:

從“第一個節點”開始,依次查詢“節點的後繼”,遍歷至“最後一個節點”,找到那個節點即可。

整體看來,有了線索後,查詢節點的前驅和後繼更加方便,搜尋的邏輯也更簡單,不需要像二叉樹那樣遞迴搜尋。