四病附、樹的應(yīng)用

樹的應(yīng)用按考綱來看的話:
1.二叉排序樹
2.堆結(jié)構(gòu)
3.哈夫曼(Huffman)樹和哈夫曼編碼
而剛好這節(jié)課剛好都講到了。
首先亥鬓,先講
二叉排序樹
也叫二叉查找樹/二叉搜索樹 BST完沪,Binary Search Tree
主要特性是:左<中<右
一些用的到的特殊函數(shù):
①Position Find(Elemtype X,BinTree BST)
//查找值為X的位置嵌戈,返回地址
這里用尾遞歸(可用循環(huán)實現(xiàn))丽焊,其查找效率取決于樹的高度较剃,當(dāng)出現(xiàn)斜二叉樹時是效率很差的情況。解決方法:平衡二叉樹(后面講)
②Position FindMin(BinTree BST)
主要實現(xiàn)是不斷往左遞歸(循環(huán)也可實現(xiàn))
③Position FindMax(BinTree BST)
往右不斷遞歸
④BinTree Insert(Elemtype X技健,BinTree BST)
//插入,注意仍保持二叉排序樹的特性:左<中<右
eg 十二個月份按字典序插入
eg BST->Right = Insert(X写穴,BST->Right);
例子中遞歸返回的樹妖賦值給其右子樹,即記錄下插入位置
⑤BinTree Delete(Elemtype X雌贱,BinTree BST)
//刪除比較麻煩啊送,先查找后刪除,根據(jù)結(jié)點不同分三種情況
(1)刪葉結(jié)點
(2)有一個兒子的結(jié)點:讓父親->孫子
(3)有左右兩個兒子的結(jié)點:兩種方案實現(xiàn)欣孤,一是 右子樹找個最小的來代替馋没,并記得再遞歸刪掉那個結(jié)點;二是 左子樹里找個最大的來代替降传,并遞歸刪掉那個結(jié)點篷朵。
因為是最值,一定只有一個兒子婆排,可以轉(zhuǎn)至(2)(1)声旺。
例子中和插入一樣,刪除的位置要記錄段只,因此
BST->Right = Insert(X腮猖,BST->Right);有類似這樣的表示

平衡二叉樹
AVL樹 Balanced Binary Tree
上面說到我么為了提高查找效率,引入平衡二叉樹的概念赞枕,其根本是為了降低樹的高度澈缺,最好是降到log2N。
因此我們讓左右結(jié)點炕婶、高度相差盡量低姐赡。
引入平衡因子balance fator的概念BF(T)=h左-h右
每個結(jié)點,注意是每個BF的絕對值<=1柠掂,或本身是個空樹即是AVL樹雏吭。
高度為h的AVL樹最少有幾個結(jié)點呢?列舉可以發(fā)現(xiàn)一個規(guī)律n(h)=n(h-1)+n(h-2)+1陪踩,我們想到斐波那契數(shù)列杖们,因此算出nh的值,得出其復(fù)雜度肩狂。
n個結(jié)點AVL樹的查找效率是log2n摘完。
AVL樹的調(diào)整
我們要將不平衡->平衡屋摇,本質(zhì)還是個二叉排序樹愚屁,注意保持左<中<右的特點成立
這里算個難點粘茄,分為四種
1.右單旋(RR旋轉(zhuǎn)) 麻煩結(jié)點在右子樹的右子樹的下面(接在左右都可)
2.左單旋(LL旋轉(zhuǎn))麻煩結(jié)點在左子樹的左子樹的下面
3.LR旋轉(zhuǎn) 麻煩結(jié)點在左子樹的右子樹的下面
4.RL旋轉(zhuǎn) 麻煩結(jié)點在右子樹的左子樹的下面


CPU在處理時,肯定不能按時間順序處理歉铝,而是按優(yōu)先順序處理偷办,怎么體現(xiàn)這個優(yōu)先隊列(按優(yōu)先權(quán)大小順序取出)呢猾昆,就是用堆肪凛。
存儲方式?jīng)Q定了執(zhí)行效率,假設(shè)分別按下面幾種存儲結(jié)構(gòu)來存儲杭措,他們的時間復(fù)雜度分別如下所示:
數(shù)組:插入O(1)查找O(1)刪除O(n)
鏈表:插入O(1)查找O(n)刪除O(1)
有序數(shù)組:查找O(n)或O(logn)插入O(n)刪除O(1)
有序鏈表:查找O(n)插入O(1)刪除O(n)
樹:二叉搜索樹费什,效率很高,但一直刪除最值后手素,導(dǎo)致樹傾斜鸳址,效率明顯下降
我們重點關(guān)注刪除的復(fù)雜度。
最大堆
始終注意兩點
1.結(jié)構(gòu)性:數(shù)組表示成完全二叉樹
2.有序性:任一結(jié)點的關(guān)鍵字是其子樹的所有結(jié)點的最大(腥场)值
最大堆Maxheap/大頂堆
最小堆Minheap/大頂堆
其結(jié)構(gòu)體如下

 struct HeapStruct{
 Elemtype *Elements;
 int Size;
 int Capacity;
  }

操作上主要有:
建堆
判滿
判空
插入
1.若不滿稿黍,插入到Size+1的位置,先保證其完全二叉樹結(jié)構(gòu)
2.保證其有序性崩哩,與父結(jié)點比較巡球,換位置,即[i/2]與[i]循環(huán)比較
刪除
1.先用最后元素替補最大值位置邓嘹,先保證其完全二叉樹結(jié)構(gòu)
2.保證其有序性酣栈,比較左右兒子,與大的換位置吴超,循環(huán)比較
時間復(fù)雜度為logn
最大堆的建立
法1.一個個插入 O(logn)
法2.在線性時間復(fù)雜度下建①N個形成二叉樹②先保證有序性再調(diào)整(注意是從下往上調(diào)钉嘹,從后往前調(diào)鸯乃,直至整個最大堆完成)

哈夫曼樹
最優(yōu)二叉樹/WPL最小的二叉樹
查找效率:出現(xiàn)比例*比較次數(shù)
目的:構(gòu)造效率最好的搜索樹
WPL帶權(quán)路徑長度:∑Wk·Lk
其中帶權(quán)值Wk鲸阻,根結(jié)點到每個葉結(jié)點的長度Lk

typedef struct TreeNode *HuffmanTree;
 struct TreeNode {
 int Weight;
 HuffmanTree Left,Right;
  }

構(gòu)造方法
循環(huán)將權(quán)值最小的兩個形成二叉樹
選取兩個最小值可使用剛講過的堆來實現(xiàn)(排序也可實現(xiàn)缨睡,但效率低)
復(fù)雜度O(nlogn)
哈夫曼樹的特點:
①沒有n為1的結(jié)點
②n個葉結(jié)點鸟悴,共有2n-1個結(jié)點
③左右子樹交換仍未哈夫曼樹
④同一權(quán)值可能有不同構(gòu)的哈夫曼樹,但最優(yōu)化值一樣
哈夫曼編碼
一段字符串奖年,要使存儲空間最少
eg ASCII 588=464位
實際只有8種字符的話 58
3=174位即可
還能更少细诸,讓出現(xiàn)頻率高的字符占用更少的空間
即不等長編碼
關(guān)鍵是避免二義性,讓根結(jié)點不成為子結(jié)點的前綴碼
把二叉樹用于編碼陋守,構(gòu)造出代價最小的二叉樹震贵,即哈夫曼樹

集合
主要涉及 交、并水评、補猩系、差、判定屬于
沒怎么認(rèn)真聽

思考:

  1. 關(guān)于AVL樹的調(diào)整中燥,感覺自己只是知其然寇甸,大概知道怎么調(diào)整,不知道考試的深度是怎么樣,考的有多細(xì)拿霉,mark下吧吟秩,過下一遍再看下
  2. 老師給的討論題 AVL樹能否用兩邊的結(jié)點樹差來定義呢?貌似挺復(fù)雜的绽淘,大家可以想一想
  3. 樹與森林部分是否和集合類似涵防?后續(xù)會補充這方面內(nèi)容。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末收恢,一起剝皮案震驚了整個濱河市武学,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伦意,老刑警劉巖火窒,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驮肉,居然都是意外死亡熏矿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門离钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來票编,“玉大人,你說我怎么就攤上這事卵渴』塾颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵浪读,是天一觀的道長昔榴。 經(jīng)常有香客問我,道長碘橘,這世上最難降的妖魔是什么互订? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮痘拆,結(jié)果婚禮上仰禽,老公的妹妹穿的比我還像新娘。我一直安慰自己纺蛆,他們只是感情好吐葵,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桥氏,像睡著了一般温峭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上识颊,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天诚镰,我揣著相機與錄音奕坟,去河邊找鬼。 笑死清笨,一個胖子當(dāng)著我的面吹牛月杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抠艾,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼苛萎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了检号?” 一聲冷哼從身側(cè)響起腌歉,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎齐苛,沒想到半個月后翘盖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡凹蜂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年馍驯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛痊。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡汰瘫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擂煞,到底是詐尸還是另有隱情混弥,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布对省,位于F島的核電站蝗拿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏官辽。R本人自食惡果不足惜蛹磺,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一粟瞬、第九天 我趴在偏房一處隱蔽的房頂上張望同仆。 院中可真熱鬧,春花似錦裙品、人聲如沸俗批。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岁忘。三九已至,卻和暖如春区匠,著一層夾襖步出監(jiān)牢的瞬間干像,已是汗流浹背帅腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麻汰,地道東北人速客。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像五鲫,于是被迫代替她去往敵國和親溺职。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子位喂。 除根結(jié)點和葉子結(jié)點外浪耘,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,218評論 0 25
  • 二叉搜索樹苗踪,平衡樹,B削锰,b-通铲,b+,b*,紅黑樹 二叉搜索樹 ? 1.所有非葉子結(jié)點至多擁有兩個兒子(Le...
    raincoffee閱讀 3,873評論 3 18
  • 四颅夺、樹與二叉樹 1. 二叉樹的順序存儲結(jié)構(gòu) 二叉樹的順序存儲就是用數(shù)組存儲二叉樹。二叉樹的每個結(jié)點在順序存儲中都有...
    MinoyJet閱讀 1,528評論 0 7
  • 1.網(wǎng)站內(nèi)頁:除了首頁以外的都是內(nèi)頁蛹稍。 2.四處一詞:可以實現(xiàn)長尾關(guān)鍵詞的良好排名吧黄。TKD+文章 3.錨文本:錨文...
    567360ff1119閱讀 246評論 0 0
  • 2016年10月30日始讀經(jīng),系統(tǒng)讀經(jīng)39周第2天唆姐,系統(tǒng)讀經(jīng)275天? 讀經(jīng)內(nèi)容:老子1-37累計4 八卦本義歌九...
    菜問媽媽閱讀 251評論 0 0