線索二叉樹 資料結構和演算法48

2021-07-07 05:58:24 字數 759 閱讀 9663

讓程式設計改變世界

change the world by program

我想正如程式猿發覺單鏈表並不總能滿足他們設計的程式某些要求的時候,發明了雙向鍊錶來彌補一樣,線索二叉樹也是在需求中被創造的!

那普通的二叉樹到底有什麼缺陷讓我們髮指呢?

一,浪費空間

二,浪費時間

三,浪費青春

數序題:請問以下有多少個「^」?總共浪費了多少位元組的空間?(32bit的機器)

腦筋急轉彎:我們知道通過對二叉樹的約定遍歷方式,可以得到乙個固定的遍歷順序,那麼請問哪種遍歷方式可以節省「^」所浪費的空間?(利用「^」記錄該結點的前驅後繼)

沒錯,中序遍歷可以拯救地球!

上圖經過中序遍歷後結果是:hdibeafcg

我們發現紅色的結點都是剛才「^」造成浪費的結點,利用中序遍歷剛好它們均處於字元中間,可以很好地利用「^」來存放前驅和後繼的指標。

不過好事總是多磨的,我們是有主觀意識所以可以很容易出來哪些結點可以利用存放前驅後繼。

有魚油不同意了:這所謂的主觀意識還不簡單,不就是從第乙個開始每隔乙個結點都可以?

上圖經過中序遍歷後結果是:fdgbace

黃色說明只有乙個空閒的指標位置,如果是這樣的話我們就面臨乙個問題:機器怎麼識別到底是存放指標還是線索?

沒錯,她需要一丁點兒提示,為此我們將已經定義好的結構進行「擴容」:

ltag為0時指向該結點的左孩子,為1時指向該結點的前驅。

rtag為0時指向該結點的右孩子,為1時指向該結點的後繼。

**:

資料結構 樹和二叉樹 二叉線索樹

遍歷二叉樹就是以一定的規則將二叉樹中的結點排列成乙個線性序列,從而得到二叉樹結點的各種遍歷序列。其實質就是對乙個非線性結構進行線性化操作,使在這個訪問序列中每乙個結點 除了第乙個和最後乙個 都有乙個直接前驅和直接後繼。在二叉樹的鏈式儲存中,只能體現出父子關係,不能直接得到結點在遍歷中的前驅和後繼。前...

線索二叉樹 資料結構

按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...

資料結構(線索二叉樹)

線索二叉樹的前序,中序,後序 typedef struct nodenode 前序線索二叉樹 參照中序即可 void prethread node p,node pre if pre null pre rchild null pre p if p ltag 0 prethread p lchild,...