輕鬆讓你徹底搞定c++版 線索二叉樹的線索化演算法
二叉樹圖
首先我們要先談談線索二叉樹資料結構的出現理由,為什麼要出現。我們可以不用線索二叉樹嗎,那是肯定的。
談線索二叉樹之前你必須對二叉樹的鏈式儲存結構遍歷非常瞭解。
如果不瞭解請先搞懂先,
我們知道二叉樹的節點資料型別有如下幾種設計孩子雙親節點,我就談這一種設計。
孩子雙親那就說明這個節點資料儲存了孩子和雙親的地址,可以立馬找到當前節點的孩子和雙親,但是如果我想不用遍歷就得到比如中序遍歷後的當前節點的前序和後序節點。
那麼我們在不改變比如我們當前節點型別的設計結構上,怎麼做,才讓我們可以輕鬆拿到節點的中序遍歷後的前後驅節點呢。
這個時候線索二叉樹就誕生了,我們肯定知道我們的二叉樹資料型別肯定並且不是完全二叉樹,也許很多二叉樹節點的指標域都是空的,是不是浪費了,這個時候我們可以把這些空的指標利用起來。我們可以儲存中序遍歷後的前後驅節點。
我們這裡是針對中序遍歷的前後驅,並且設計的節點資料型別比較簡單,僅僅是當前節點資料+ 孩子節點的地址指標,現在問題來了既然節點指標域既可以儲存他的孩子節點,又可以儲存線索也就是中序遍歷的前或者後驅節點地址。
那麼我們可以必須設計新節點的資料型別
//設計二叉樹的節點資料型別
typedef struct BiTree
{
//節點資料
int data;
//左孩子的指標變數
struct BiTree* lChild, *rChild;
int lTag, rTag; // 規則:0表示當前節點左指標域儲存的是左孩子地址 1儲存是當前節點的前驅節點線索
}*BiTree;
我們首先個約定:約定lTag這個變數取0和1並且是針對當前節點的左孩子指標變數,至於這個變數儲存的是左孩子節點還是前驅節點,我們可以根據是 0 還是1 我們預設儲存左孩子節點 這個時候標誌lTag = 0,
rTag這個是針對右指標 0表示存的是節點的右孩子節點 1表示存的是後驅節點
下面上具體程式碼。我們採用的是遞迴演算法線索化二叉樹。也就是把空指標域裡面填上線索的過程。
//中序遍歷二叉樹併線索化 root:儲存了二叉樹物件的根節點地址
void InitThread(BiTree root)
{
//開闢臨時變數儲存當前遍歷的節點地址
BiTree temp = root;
//判斷二叉樹是不是為空
if(root != null)
{
//先遞迴呼叫自身線索化當前節點的左子樹 由於是中序遍歷
InitThread(root->lChild);
/*開始線索化當前節點*/
先線索化當前節點前驅節點
if(root->lChild == null)
{
//設定標誌位 表明當前節點存的是線索而不是孩子節點地址
root->lTag = 1;
//開始真正線索化
root->lChild = pre; //根據中序遍歷我們知道當前訪問的節點就是其左孩子的前驅節點
}
//開始當前節點的後驅線索化
if(pre != null && pre->rChild == null)
{
//開始設計標誌為 表示當前右指標域存的是線索不是右孩子節點
pre->rTag = 1;
//後驅線索化真正開始
pre->rChild = root;
}
//遞迴右孩子線索化
InitThread(root->rChild);
}
}
“`
相關文章
- 線索二叉樹的線索化演算法二叉樹演算法
- 線索二叉樹【定義、應用、線索化、遍歷】二叉樹
- 13、線索二叉樹二叉樹
- 【筆記】線索二叉樹筆記二叉樹
- 二叉線索樹實現
- 【資料結構】二叉樹的線索化!!資料結構二叉樹
- 線索二叉樹的原理及建立二叉樹
- 資料結構之線索化二叉樹資料結構二叉樹
- 演算法線索二叉樹的建立和遍歷演算法二叉樹
- 二叉樹(順序儲存二叉樹,線索化二叉樹)二叉樹
- 線索二叉樹的構造和遍歷二叉樹
- 實戰資料結構(12)_二叉樹的線索化資料結構二叉樹
- 【資料結構&演算法】12-線索二叉樹資料結構演算法二叉樹
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 中序線索二叉樹的建立與遍歷二叉樹
- 常用資料結構之線索二叉樹資料結構二叉樹
- 線索二叉樹 Threaded BinaryTree二叉樹thread
- java實現-資料結構之二叉樹(三):線索化二叉樹Java資料結構二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 論 如何畫線索二叉樹[資料結構]二叉樹資料結構
- 輕鬆搞定面試中的二叉樹題目面試二叉樹
- 線段樹 - 多組圖帶你從頭到尾徹底理解線段樹
- 讓你輕鬆實現Mac與相機的連線Mac
- 基於二叉樹的高效IP檢索格式MMDB二叉樹
- C++演算法 線段樹C++演算法
- 讓你徹底理解 “==”與 Equals
- 徹底搞懂Redis持久化機制,輕鬆應對工作面試Redis持久化面試
- CRM系統如何自動分配線索
- 看完讓你徹底搞懂Websocket原理Web
- 對JVM還一知半解?這篇文章讓你徹底搞定JVM!JVM
- 擊敗二分檢索演算法——插值檢索、快速檢索演算法
- 輕鬆搞定專案流程自動化
- 一張圖徹底搞定 explainAI
- 一文輕鬆搞定 tarjan 演算法(二)演算法
- 這次我讓你徹底弄懂 RESTfulREST
- 銷售線索是如何匯入CRM系統的?
- CTF學習(14)MISC(資料包中的線索)
- 辦公室革命,教你輕鬆搞定輕鬆玩轉ExcelExcel