日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

深入学习二叉树(二) 线索二叉树

發布時間:2025/3/12 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入学习二叉树(二) 线索二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深入學習二叉樹(二) 線索二叉樹

1 前言

在上一篇簡單二叉樹的學習中,初步介紹了二叉樹的一些基礎知識,本篇文章將重點介紹二叉樹的一種變形——線索二叉樹。

2 線索二叉樹

2.1 產生背景

現有一棵結點數目為n的二叉樹,采用二叉鏈表的形式存儲。對于每個結點均有指向左右孩子的兩個指針域,而結點為n的二叉樹一共有n-1條有效分支路徑。那么,則二叉鏈表中存在2n-(n-1)=n+1個空指針域。那么,這些空指針造成了空間浪費。
例如:圖2.1所示一棵二叉樹一共有10個結點,空指針^有11個。


此外,當對二叉樹進行中序遍歷時可以得到二叉樹的中序序列。例如:圖2.1所示二叉樹的中序遍歷結果為HDIBJEAFCG,可以得知A的前驅結點為E,后繼結點為F。但是,這種關系的獲得是建立在完成遍歷后得到的,那么可不可以在建立二叉樹時就記錄下前驅后繼的關系呢,那么在后續尋找前驅結點和后繼結點時將大大提升效率。

2.2 線索化

現將某結點的空指針域指向該結點的前驅后繼,定義規則如下:

若結點的左子樹為空,則該結點的左孩子指針指向其前驅結點。
若結點的右子樹為空,則該結點的右孩子指針指向其后繼結點。

這種指向前驅和后繼的指針稱為線索。將一棵普通二叉樹以某種次序遍歷,并添加線索的過程稱為線索化。
按照規則將圖2.1所示二叉樹線索化后如圖2.2所示:

圖中黑色點畫線為指向后繼的線索,紫色虛線為指向前驅的線索。
可以看出通過線索化,既解決了空間浪費問題,又解決了前驅后繼的記錄問題。

2.3 線索化帶來新問題

經過2.2節講解后,可以將一棵二叉樹線索化為一棵線索二叉樹,那么新的問題產生了。我們如何區分一個結點的lchild指針是指向左孩子還是前驅結點呢?例如:對于圖2.2所示的結點E,如何區分其lchild的指向的結點J是其左孩子還是前驅結點呢?
為了解決這一問題,現需要添加標志位ltag,rtag。并定義規則如下:

ltag為0時,指向左孩子,為1時指向前驅
rtag為0時,指向右孩子,為1時指向后繼

添加ltag和rtag屬性后的結點結構如下:

圖2.2所示線索二叉樹轉變為圖2.3所示的二叉樹。

2.4 線索二叉樹結點數據結構

//#define Link 0//指針標志 //#define Thread 1//線索標志 typedef char TElemType; //中序線索二叉樹 typedef enum PointerTag {Link, Thread};//結點的child域類型,link表示是指針,指向孩子結點,thread表示是線索,指示前驅或后繼結點 //定義結點數據結構 typedef struct ThrBiNode{ TElemType data; ThrBiNode *lchild, *rchild;//左右孩子指針 PointerTag lTag, rTag;//左右標志 }ThrBiNode, *ThrBiTree;

2.5 中序遍歷建立線索二叉樹

中序遍歷的方法已經在第一篇二叉樹基礎中講解過,那么實現線索化的過程就是在中序遍歷同時修改結點空指針的指向。
采用中序遍歷的訪問順序實現一棵二叉樹的線索化過程代碼如下:

//中序遍歷進行中序線索化 void inThreading(ThrBiTree T, ThrBiTree &pre){ if(T){ inThreading(T->lchild, pre);//左子樹線索化 if(!T->lchild){//當前結點的左孩子為空 T->lTag = Thread; T->lchild = pre; }else{ T->lTag = Link; } if(!pre->rchild){//前驅結點的右孩子為空 pre->rTag = Thread; pre->rchild = T; }else{ pre->rTag = Link; } pre = T; inThreading(T->rchild, pre);//右子樹線索化 } }

2.6 加上頭結點,遍歷線索二叉樹

加上線索的二叉樹結構是一個雙向鏈表結構,為了便于遍歷線索二叉樹,我們為其添加一個頭結點,頭結點左孩子指向原二叉樹的根結點,右孩子指針指向中序遍歷的最后一個結點。同時,將第一個結點左孩子指針指向頭結點,最后一個結點的右孩子指針指向頭結點。
圖2.3所示線索二叉樹添加頭結點后如圖2.4所示:


帶有頭結點的線索二叉樹遍歷代碼如下:

//T指向頭結點,頭結點的lchild鏈域指針指向二叉樹的根結點 //中序遍歷打印二叉線索樹T(非遞歸算法) void inOrderTraversePrint(ThrBiTree T){ ThrBiNode *p = T->lchild;//p指向根結點 while(p != T){//空樹或遍歷結束時,p == T while(p->lTag == Link){ p = p->lchild; } //此時p指向中序遍歷序列的第一個結點(最左下的結點) printf("%c ", p->data);//打印(訪問)其左子樹為空的結點 while(p->rTag == Thread && p->rchild != T){ p = p->rchild; printf("%c ", p->data);//訪問后繼結點 } //當p所指結點的rchild指向的是孩子結點而不是線索時,p的后繼應該是其右子樹的最左下的結點,即遍歷其右子樹時訪問的第一個節點 p = p->rchild; } printf("\n"); }

3 結語

線索二叉樹充分利用了指針空間,同時又便于尋找結點的前驅結點和后繼結點。線索二叉樹適用于經常需要遍歷尋找結點前驅或者后繼結點的二叉樹。

總結

以上是生活随笔為你收集整理的深入学习二叉树(二) 线索二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天操网 | av番号网| 美女综合网 | 欧美在线v | 噼里啪啦国语版在线观看 | 色午夜婷婷 | 亚洲天堂网视频 | 97人妻精品一区二区三区软件 | 天堂中文av | 色乱码一区二区三区 | 风流少妇按摩来高潮 | 8x8ⅹ国产精品一区二区二区 | 色悠悠视频 | 欧美日韩亚洲另类 | 蜜桃成人在线 | 毛片毛片毛片毛片毛片 | 亚洲网站免费 | 日韩精品一区三区 | 国产另类av | 黄色一极毛片 | 国产xxxxx在线观看 | 97理伦 | 特黄做受又粗又大又硬老头 | 亚洲AV无码一区二区伊人久久 | 国产色自拍 | 国产麻豆免费观看 | 精品少妇人妻av一区二区三区 | 夜色视频网站 | 九九99视频 | www.毛片com| 国产一区二区片 | 人妻一区二区三 | 奇米超碰在线 | 国产东北真实交换多p免视频 | 亚洲精品白浆 | 男女天堂av | 一区二区三区黄色片 | 91精品国产综合久久香蕉 | 美女又爽又黄免费 | 成人爽a毛片一区二区 | 一本一道波多野结衣av黑人 | 黄在线观看免费 | 无码国产69精品久久久久网站 | 日本少妇毛茸茸高潮 | 在线观看波多野结衣 | 婷婷五月在线视频 | av三级在线播放 | 国产精品一区二区亚洲 | 在线天堂视频 | 久久久久久婷 | 欧美日韩资源 | 久久久精品影视 | 亚洲专区在线视频 | 岳睡了我中文字幕日本 | 床戏高潮做进去大尺度视频 | 57pao国产精品一区 | 国产黄a三级三级三级 | 久久精品国产欧美亚洲人人爽 | 久久久久国产精品视频 | 一级特黄色大片 | 日韩毛片在线视频 | 亚洲精品图区 | 日韩综合一区二区 | 成人不卡| 尤物影院在线观看 | 久久婷婷av | 天天操天天爽天天干 | 成人学院中文字幕 | 尤物视频官网 | 中文字幕人妻熟女在线 | 91看片国产 | 免费一区二区在线观看 | 成人综合区 | 日日日人人人 | 天天天天天天天天干 | 国产一区免费在线 | 操你啦在线视频 | 韩国国产在线 | 97视频免费 | 欧美成人aaaaⅴ片在线看 | 特级西西444www高清大视频 | 另类欧美亚洲 | 相亲对象是问题学生动漫免费观看 | 久久久久久九九九 | 捆绑少妇玩各种sm调教 | 亚洲无吗av | 91黄色免费看 | 亚洲成人激情视频 | 蜜桃精品在线观看 | 日韩蜜桃视频 | 天堂av最新网址 | 人人干狠狠干 | 亚洲一区二区精华 | 国内精品久久久久久久久 | 综合久久91 | 久久这里只有精品久久 | 巨物撞击尤物少妇呻吟 | 成人乱码一区二区三区av | 亚洲网站在线观看 |