A與B的對話之線索二叉樹

2022-09-08 20:18:17 字數 1374 閱讀 3406

a:什麼是線索二叉樹?

b:先別著急,你知道二叉樹的定義的儲存結構是什麼嗎?

a:當然知道,就是包含乙個值域和兩個指標域的結構體,下圖所示

typedef struct node

tree

b:是的,是這樣的,我們可以從**中看出,我們可以通過left和right指標來找到乙個結點的左右孩子,對嗎?那如果我們想要找到乙個結點的前驅和後繼該怎麼辦呢?

a:很容易找到左右孩子,嗯?前序和後繼?這個是什麼意思?

b:我們知道乙個樹有三種遍歷,前後中,比如乙個樹的前序遍歷是abc,我們很容易看出b的前驅結點時a,b的後繼結點是c,當我們遍歷整個二叉樹時,很容易找出某個結點的前驅和後繼,那麼如果我需要直接讓你用**找出乙個結點的前驅和後繼,你該怎麼辦呢?

a:新增新的指標嗎?

b:不用不用,你想想我們建立一棵有n個結點的樹時,建立了多少指標?

a:乙個結點兩個指標,當然是2n個指標

b:我們一共用了多少個指標呢?

a:n個結點的二叉樹的一共有n-1條分支,那麼我們就用了n-1個指標,還有2n-(n-1)個指標沒有使用

b:對了,我們就可以利用著n+1個指標來指向乙個結點的前驅和後繼,而且還利用了空間

a:我有點糊塗了,那應該怎麼做呢?

b:因為我們的結點本生就具有兩個指標,我們如何知道它的左右孩子是指向前驅還是後繼呢?我們在原有的基礎上,加上ltga和rtag來判斷左右指標的指向

ltag==0時代表該結點的left指標指向的是左孩子

ltag==1時代表該結點的left指標指向的是前驅結點

同理可知rtag

a:我明白了!那我們該如何實現呢

b:我們在遍歷二叉樹的時候就會知道結點的前驅,那時候我們就可以給ltag和rtag進行賦值

a:我通過中序遍歷來給ltag和rtag賦值

#include #includeusing namespace std;

typedef struct node

threadtree;//線索二叉樹

threadtree *create()//遞迴建立二叉樹

return t;

}void zhongxu(threadtree *t)//中序線索二叉樹

if(pre->right==null)//右是後繼

pre=t;

coutzhongxu(t->right);

}}int main()

a:這就是線索二叉樹的過程,現在你明白什麼是線索二叉樹了嘛

b:明白了!線索二叉樹就是利用二叉樹空閒的指標,將它指向結點的前驅後者後繼,這樣就很快可以找到乙個結點的前驅和後繼

a:yes,就是這樣。不要忘記了,線索二叉樹有三種結構哦~

二叉樹之 線索二叉樹

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊 對於n個結...

複習二叉樹之線索二叉樹

include 線索二叉樹是在遍歷的過程中線索化 typedef struct bithrnodebithrnode,bithrtree bithrtree pre 全域性變數 建立二叉鍊錶 先序遍歷建立 關鍵在於 表明空樹 void createbitree bithrtree a else 為什...

樹與二叉樹 線索二叉樹

若結點有左子樹,則其lchild域指向其左子樹,否則令lchild域指向其前驅 若結點有右子樹,則其rchild域指向其右子樹,否則令rchild域指向其後繼 為了避免混淆,需要改變結點結構,增加兩個標誌域,ltag,rtag,結構如下圖所示 0 lchild域指向其左子樹 1 lchild域指向其...