對線索化二叉樹的理解(三)
阿新 • • 發佈:2018-12-25
上一篇的《理解(二)》中漏掉了一點, 對二叉樹進行線索化的時候,最後pre更新成為樹中最右下角那個葉子節點,這個節點還沒有線索化,需要對他單獨線索化, 在函式最外面 pre->Rtga = Thread; pre->Rchild = NULL; 即可。
這裡簡單說下線索化二叉樹的方法實現:
一、查詢二叉樹中序線索化後的第一個節點:其實就是中序遍歷的最左邊的節點。 放到線索化裡面,就是遞迴左子樹,直到左標記為線索 Ltag = thread 的那個節點。
二、查詢二叉樹中序線索化後的最後一個節點:其實就是中序遍歷的最右變的節點。 放到線索化裡面,就是遞迴右子樹,直到右標記為線索, Rtag = thread的那個節點。
三、查詢某節點的前驅:
(1)如果這個節點有左線索,那前驅就是leftchild;
(2)如果這個節點左標記為Link,那麼按照中序遍歷,這個節點的前驅就是“這個節點的左子樹的最後一個節點”,用上面的方法二即可。
四、查詢某節點的後繼:
(1)如果這個節點有右線索,那後繼就是rightchild;
(2)如果這個節點的右標記為Link,那麼按照中序遍歷,這個節點的後繼就是“這個節點的右子樹的第一個節點”,用上面的方法一即可。
五,根據資料域,查詢某節點:
從“第一個節點”開始,依次查詢“節點的後繼”,遍歷至“最後一個節點”,找到那個節點即可。
整體看來,有了線索後,查詢節點的前驅和後繼更加方便,搜尋的邏輯也更簡單,不需要像二叉樹那樣遞迴搜尋。