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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android技能树 — 树基础知识小结(一)

發布時間:2025/3/20 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android技能树 — 树基础知识小结(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

現在安卓面試,對于數據結構的問題也越來越多了,也經常看到別人發的面試題都是問什么紅黑樹,二叉樹查找等,所以我們雖然不會馬上就會各種難的面試題,但起碼樹的基礎知識還是要會的,這樣才能去進一步學。

貼上最近看到的一個介紹圖片:

Android技能書系列:

Android基礎知識

Android技能樹 — 動畫小結

Android技能樹 — View小結

Android技能樹 — Activity小結

Android技能樹 — View事件體系小結

Android技能樹 — Android存儲路徑及IO操作小結

Android技能樹 — 多進程相關小結

Android技能樹 — Drawable小結

數據結構基礎知識

Android技能樹 — 數組,鏈表,散列表基礎小結

Android技能樹 — 樹基礎知識小結(一)

算法基礎知識

Android技能樹 — 排序算法基礎小結

本文主要講關于樹的基礎知識。

樹(Tree)是n(n>=0)個結點的有限集。n=0時稱為空樹。在任意一棵非空樹中:(1)有且僅有一個特定的稱為根(Root)的結點;(2)當n>1時,其余結點可分為m(m>O)個互不相交的有限集T1、T2、……、 Tm,其中每一個集合本身又是一棵樹,并且稱為根的子樹(SubTree)

基礎知識

結點

根據上面的基礎知識我畫了一個歸總的圖(這樣我就不需要寫文字介紹了,啊哈哈):

樹結構特點

還是用自己畫的圖來說明:

存儲結構

在Android技能樹 — 數組,鏈表,散列表基礎小結中,我們介紹了線性存儲,鏈式存儲,我們的樹可以充分用二者來結合表示。

我們統一來用上面各種方式來表示下面這個樹的存儲結構:

雙親表示法:

在每個結點中,附設一個指示器指示其雙親結點在數組中的位置。

因為有十一個結點,所以我們的index為0-10,然后index位置中存儲(data + parent的index值),結果如下圖所示:

這里我們發現根據index里面的parent指針,很容易知道父結點,但是比如我問知道了E結點,想知道它的子結點是哪幾個,就不知道了,只能通過整個結構的遍歷。

當然我們可以變相的 多加一個指針:

如果我們又比較關注兄弟結點之間的關系,可以增加一個右兄弟域來體現兄弟關系:

孩子鏈表表示法:

把每個結點的孩子結點排列起來,以單鏈表作存儲結構,則n 個結點有n個孩子鏈表,如果是葉子結點,則此單鏈表為空。然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中。

用孩子表示法表示我們上面的樹,結構如下:

所以我們的結點結構有二種: 1.表頭數組的表頭結點:

  • 孩子鏈表的孩子結點:
  • 但是這樣子對于查找某個結點的孩子,或者找某個結點的兄弟都方便,但似乎如果要找某個結點的雙親結點就麻煩了。所以我們可以結合上面講過的《雙親表示法》

    雙親孩子表示法:

    把上面二個方法結合就可以了。

    孩子兄弟表示法:

    任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。 所以設置二個指針,分別指向該結點的第一個孩子和此結點的右兄弟

    所以和上面類似,只是我們存了不同的二個指針(從方法名字就知道,<孩子><兄弟>法,一個孩子,一個兄弟,二個指針)。

    我們把上面的樹按照這種方式實現:

    森林:

    繼續畫個圖來說明,省得打字了,嘿嘿:

    分類

    樹也是會根據不同條件,做了分類,我們來了解一下。

    那有序樹和無序數的區別在于哪里呢?

    如果將樹中結點的各子樹看成從左至右是有次序的,不能互換,則成為有序樹,否則就是無序樹

    比如我們只是單純的表示一個家族的關系:

    比如只是說明A的孩子有B跟C,這時候B和C換了位置葉 沒關系,這時候就是無序樹。

    但是如果我們這個家族譜是按照年齡來排序(長子,次子),那這時候B和C就不能換位置了,這時候就是有序樹。

    但是我們平常說的樹通常都是指的有序樹,而有序樹有很多分類,比較多的就是二叉樹。

    二叉樹:

    基本形態:

    二叉樹性質:

    其實這個類似與我們以前數學課上要背的數學公式,大家可以自己畫個二叉樹,然后試著上面的公式比對下,是不是正確。

    遍歷二叉樹:

    二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問依次且僅被訪問一次。

    前序遍歷:

    單單看這個圖,其實換成我,我也看不懂規律,但是我們只需要懂得其中的規則就行。

    偽代碼:遍歷(結點對象 t){if( t == null){return;}//第一步,實現某個業務操作,比如我們是打印結點字符串。print(t)//第二步,遞歸方式繼續調用該方法遍歷左孩子遍歷(t.左孩子)//第三步,遞歸方式繼續調用該方法遍歷右孩子遍歷(t.右孩子) } 復制代碼

    我們看到因為print在其他方法的前面,所以叫前序遍歷。我們現在傳入根結點到這個方法,然后依次打印并且遞歸,就會發現,就是圖上的順序。

    中序遍歷:

    偽代碼:遍歷(結點對象 t){if( t == null){return;}//第一步,遞歸方式繼續調用該方法遍歷左孩子遍歷(t.左孩子)//第二步,實現某個業務操作,比如我們是打印結點字符串。print(t) //第三步,遞歸方式繼續調用該方法遍歷右孩子遍歷(t.右孩子) } 復制代碼

    我們發現只要把我們的打印語句放在中間,就是中序遍歷了。

    后序遍歷:

    偽代碼:遍歷(結點對象 t){if( t == null){return;}//第一步,遞歸方式繼續調用該方法遍歷左孩子遍歷(t.左孩子)//第二步,遞歸方式繼續調用該方法遍歷右孩子遍歷(t.右孩子)//第三步,實現某個業務操作,比如我們是打印結點字符串。print(t) } 復制代碼

    我們發現只要把我們的打印語句放在最后,就是后序遍歷了。

    二叉樹分類:

    斜樹:

    完全二叉樹與滿二叉樹:

    一棵深度為k,且有 2^(k+1) - 1 個節點的二叉樹稱為滿二叉樹,這種樹的特點是每一層上的節點數都是最大節點數。

    而在一棵二叉樹中,除最后一層外,若其余層都是滿的,并且最后一層或者是滿的,或者是在右邊缺少連續若干節點,則此二叉樹為完全二叉樹。

    滿二叉樹

    完全二叉樹

    平衡二叉樹:

    這塊知識很多,后期補上。

    排序二叉樹:

    這塊知識很多,后期補上。

    線索二叉樹:

    n個結點的二叉鏈表中含有n+1(2n-(n-1)=n+1)個空指針域。利用二叉鏈表中的空指針域,存放指向結點在某種遍歷次序下的前驅和后繼結點的指針(這種附加的指針稱為"線索")。

    這里一定要說明一個知識點:什么是前驅和后繼。

    網上很多人都是對這個解釋太過于簡單以至于很多人理解錯誤,比如:

    假設我們現在有這個一個二叉樹:

    我現在問 I 的前驅是誰,后繼是誰,很多人就單純的從樹的形狀上來看,也就是看 I 的上一個結點是D,所以前驅是D, I 沒有后面的子結點,所以后驅為空。這種回答是錯誤的。我們在 Android技能樹 — 數組,鏈表,散列表基礎小結文中提到過前驅和后繼:

    比如雙向鏈表就是有前驅和后繼。那我們單純看這棵樹是看不出來的,我們要先把樹按照某個遍歷方式的時候,把它用這種鏈表形式擺列,然后才能知道某個結點的前驅和后繼是什么,比如上面的圖我們用中序遍歷,我們得到的是:HDIBJEAFCG,這時候 I 的前繼是D,后繼是B。

    我們在二叉樹存儲結構中,有二個指針指向它的二個子結點。

    但是可能只有一個子結點,或者沒有子結點,這樣這個空的指針存儲就浪費了,我們可以在這個指針里面存這個結點的前驅或者后繼結點的指針。

    但是這時候又有一個問題,就是我們不知道這個點目前到底放的是前驅的還是左子結點的指針,所以我們還需要一個參數來說明當前這個位置放的是哪個的指針。

  • 當ltag為0的時候,說明lchild是該結點的左孩子的指針,為1的時候說明lchild是該結點的前驅。
  • 當rtag為0的時候,說明rchild是該結點的右孩子的指針,為1的時候說明rchild是該結點的后繼。
  • 存儲結構:

    二叉樹順序存儲結構:

    我們把二叉樹補充為一個滿二叉樹,然后相應的填入一個一維數組即可。

    二叉鏈表:

    二叉樹每個結點最多又二個孩子,所以為它設計一個數據域和二個指針域。

    三叉鏈表:

    改進于二叉鏈表,增加父節點的指引,能更好地實現節點間的訪問

    結語:

    本文并沒有寫完,內容太多,后面再陸續補上去。哪里寫錯了,歡迎指出。。。謝謝。

    參考:

    《大話數據結構》

    《維基百科》

    總結

    以上是生活随笔為你收集整理的Android技能树 — 树基础知识小结(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 人妻少妇一区二区三区 | 日韩成人在线看 | 有码一区| 一二三区在线观看 | 自拍第一页| 日韩美女av在线 | 四虎在线看片 | www狠狠操| 国产午夜精品理论片在线 | 成人福利视频网 | 日韩美女啪啪 | 欧美一性一乱一交一视频 | 人人澡人人澡人人澡 | 欧美国产一级片 | 美女露胸无遮挡 | 涩涩视频在线观看 | 教练含着她的乳奶揉搓揉捏动态图 | 一对一色视频聊天a | 国产三级精品在线观看 | 一区二区国产精品精华液 | 蜜臀av性久久久久av蜜臀妖精 | 久久久久国产精品一区二区 | 欧美四虎 | 国产精品77777| 日韩久久一区二区三区 | 息与子五十路翔田千里 | 国产内射老熟女aaaa∵ | 亚洲精品福利在线观看 | 国产精品免费一区二区三区 | 国产情趣视频 | 九色视频在线播放 | 性高潮免费视频 | 日韩欧美极品 | 福利免费视频 | 亚洲人成在线播放 | 黑丝美女啪啪 | 涩涩视频网站在线观看 | 久久人成 | 欧美日本韩国一区二区三区 | 日本新japanese乱熟 | 日韩精品成人一区 | 欧美性猛交xxx乱大交3 | 176精品免费| 国产精品卡一 | 中国国产精品 | 视频在线观看视频 | 91热爆视频 | 中文字幕一区二区在线观看视频 | 成人午夜黄色 | 亚洲蜜臀av乱码久久精品蜜桃 | 在线视频精品免费 | 老司机午夜精品 | 欧美变态网站 | 麻豆视频网站入口 | 色av性av丰满av | 黄色小说图片视频 | 国产91精品久久久 | 蜜臀网在线 | 日本美女黄网站 | 国产精品成人国产乱一区 | 成人夜夜 | 久久久青 | 免费观看视频在线观看 | 韩国女主播一区二区 | 久久影院午夜理论片无码 | 欧美成人三级视频 | 久久视频中文字幕 | 成人av资源在线 | 熟女人妇 成熟妇女系列视频 | 日韩中文字幕久久 | 最新中文字幕第一页 | 91黄色入口| 日本福利一区二区三区 | 国产成人精品在线观看 | 黄色片久久久久 | www一级片 | 国产精品成人无码专区 | 亚洲一区二区三区高清在线 | 一级黄色大片在线观看 | 日韩一级精品 | www.99av| 91成人精品国产刺激国语对白 | 日本嫩草影院 | 美女隐私无遮挡免费 | 全肉的吸乳文 | 波多野吉衣毛片 | 一区www | 欧美黄色三级 | 免费中文字幕日韩欧美 | 久久99国产精品 | 蜜桃在线一区二区 | 色 综合 欧美 亚洲 国产 | 国产色网址| 少妇又色又爽又黄的视频 | 熟妇高潮一区二区 | 日本精品视频在线播放 | 黄色美女片 | 色中色综合网 | 国产黄在线观看 |