圖解!10張圖揭秘樹和森林!

2021-01-09 51CTO

說起樹,想必大多數人第一反應都是二叉樹以及二叉樹的各種親戚,包括紅黑樹、平衡二叉樹等。但是其實除了二叉樹外,普通的樹結構在數據結構中也佔據著非常重要的一部分。

不僅如此,所謂百川成海,白木成林。既然有了樹結構,自然而然也會有相應的森林結構。因此,本文就將從普通的樹結構出發,探討並介紹一下樹和森林的那些事。

1 樹的定義

樹實際上就是由許多個節點組成的集合,只不過每個節點的的組成是根據樹狀結構進行劃分。一顆普通的樹結構可以通過以下圖來定義。

還是再來羅嗦一遍,樹的結構就像是一顆倒掛的樹,結點的組成是以層級往下。一棵樹由若干子樹構成,而子樹又有更小的子樹構成。

樹的血緣關係

對於樹中的某個結點,最多只和上一層的結點有直接的關係,而與其下一層的多個結點有直接關係。其上一層的結點稱為雙親結點,下一層的結點稱為孩子結點。所有位於樹的最底部,沒有孩子結點的結點被稱之為葉子節點。具有相同雙親的結點互為兄弟節點。

樹的家族等級

樹是一個大家族,等級十分森嚴。樹中某個結點的子樹個數稱為該結點的度。所以葉子結點也就是度為0的結點。而度不為0的結點被稱之為內部結點。每一個結點都具有自己的層次,該層次由高往低遞增,根結點為第一層,根的孩子結點為第二層,依次類推。一棵樹最大的層數稱之為樹的高度(或深度)。

2 樹的存儲結構

由於普通的樹結構並不像二叉樹那麼規則,可能是多叉樹的組合,因此很難用常規的線性結構來存儲。因此樹結構的存儲需要將樹家族中的關係剝離出來進行存儲,保存了每個結點之間的關係,整個樹結構也就能依次進行恢復。

這就好比家族中的族譜一樣,記錄的是我們和雙親以及兄弟姐妹的關係。對於樹而言,則根據存儲關係的不同,可分為雙親表示、孩子表示以及孩子兄弟表示三種存儲方法。

雙親表示法

樹的雙親表示,顯然就是通過記錄每個結點的雙親結點來存儲整顆樹的層次關係。這裡常用的一種存儲結構就是數組。在連續的地址中存儲樹的結點,同時將之與其雙親結點在數組中的序號進行對應,這樣一來就能夠保存所有結點的雙親信息。

雙親表示法直接存儲的是結點的雙親位置(對應於數組的下標),因此在求某個結點的雙親結點以及祖先結點時非常方便。但是卻無法直接獲得該結點的孩子結點的位置。

若需要查找指定結點的孩子以及後代結點,需要遍歷整個數組並進行多次判斷才行。

孩子表示法

樹的雙親表示法的缺點顯而易見,所以最直接的解決辦法就是乾脆存孩子結點算了。還別說,孩子表示法就是這樣一種表示方法。但是相較於雙親結點的存儲,存儲孩子結點有一個需要考慮的問題,就是某個結點的雙親結點最多只有一個,但是其孩子結點可能有多個。如果每個孩子結點都存儲在數組裡,這樣的方式不是一個明智的選擇,並且也沒有必要。

所以在使用孩子表示法來存儲樹的結構時,常使用數組+鍊表的結構。這種結構是不是很常見,跟解決哈希衝突的鏈地址法有異曲同工之意。在這樣的鏈式結構中,用指針指示出結點的每個孩子,每個孩子的位置通過鍊表依次相連,這樣就十分方便與查找每個結點的子孫。

只不過問題依舊,若要找出尋找某個結點的雙親則同樣需要遍歷所有鍊表。不過,既然雙親表示和孩子表示都有了,簡單粗暴的合併一下不就可以相互補充,共同進退嗎。

所謂的雙親孩子表示法,直接將雙親表示和孩子表示組合起來即可。這樣即可滿足雙親的查找,也可以滿足孩子的查找。

孩子兄弟表示法

本來有了雙親孩子表示法就已經足夠用來存儲樹中的數據信息了,為什麼還要來一個孩子兄弟法呢?其實不然,孩子兄弟表示法反而是一種很有意思且很有價值的表示方式。

在孩子兄弟表示法中,我們約定只存儲每個結點的第一個孩子結點和下一個兄弟結點。不僅如此,結點的存儲是通過鍊表進行的。話說不太清,還是直接看圖吧。

看起來似乎有些詭異的形狀,每個結點都作為鍊表的一個節點,通過兩個指針分別指向第一個孩子結點和下一個兄弟結點。為了防止大家看不懂,我舉個例子。拿結點B來說,它的第一個孩子結點是E,而它的下一個兄弟是與它處於同一層級的C。因此結點B的兩個指針分別指向了E和C。

孩子兄弟表示法這樣看起來似乎很雞肋,但是假如我們調整一下右邊這個圖,就能看出其中的蹊蹺了。

看出來了嗎,孩子兄弟表示法實際上就是將一顆普通的樹轉換成了二叉樹的形式。所以說二叉樹為什麼這麼重要,因為萬變不離其中呀。看到這,其實也透露出樹和二叉樹之間的轉換關係,許多二叉樹上的性質和操作也可以藉此運用在普通的樹結構中。

3 樹的遍歷

學過二叉樹的同學想必應該對前序遍歷、中序遍歷、後序遍歷、中序遍歷爛熟於心了吧,無論是迭代還是非迭代的寫法,都是基礎得不能再基礎的東西了。而對於普通的樹而言,由於每個結點子樹的個數並不一定,因此不好規定前、中、後序的順序。

所以一般而言對於樹的遍歷方式有兩種,根據根結點被遍歷的先後可分為先根遍歷和後根遍歷。

樹的先根遍歷是先訪問樹的根節點,然後依次遍歷根結點的各個子樹。如此遞推。當將一顆普通樹轉換為對應的二叉樹時(孩子兄弟表示法),其實就相當於是前序遍歷。

樹的後根遍歷就不用多說了吧,跟先根遍歷相反,先訪問根結點的各顆子樹,再訪問樹根結點。而樹的後根遍歷就相當於轉換後二叉樹的中序遍歷。不信的話你試試。

4 樹、森林和二叉樹的相互轉換

寫到這,突然發現好像忘記介紹森林是什麼東西了。其實森林的概念很簡單,就是很多顆樹。對,就是這樣。

樹、森林和二叉樹本質上都是類似的結構,因此相互之間可以進行轉換。任意一個森林或者一棵樹都可以對應表示為一顆二叉樹,而任何一顆二叉樹也能夠對應到一個森林或一棵樹上。

樹轉換為二叉樹,我們在前面已經介紹過,就是通過樹的孩子兄弟表示法。通過孩子兄弟法進行表示時,每一個樹都可以用一顆唯一的二叉樹來表示。但是轉換過來的二叉樹卻有一個非常顯著的特點。仔細觀察。

很顯然,這不是一顆平衡的二叉樹。並且,根節點是沒有右子樹的,我敢肯定的說。這是因為根節點是沒有兄弟結點的,它只有孩子結點,所以在轉換為二叉樹之後,一定是沒有右子樹的。

不過這樣的缺陷可以在森林中進行彌補。由於森林中有很多棵樹,因此可以將其它樹作為右子樹。具體的實現步驟,先將森林中的每一棵樹轉換為二叉樹,再將第一顆樹的根結點作為轉換後的二叉樹的根。第一棵樹的左子樹作為轉換後二叉樹根結點的左子樹,第二棵樹作為轉換後二叉樹的右子樹。第三顆樹作為轉換後二叉樹根結點的右子樹的右子樹。以此類推。

咱們來舉個例子。這裡有一個由三顆樹構成的森林。

將上面三棵樹分辨轉換二叉樹是以下形式。

然後將綠色二叉樹作為藍色二叉樹根節點的右子樹,將黃色二叉樹作為綠色二叉樹根節點的右子樹,就可以得到森林轉換為二叉樹的結果。

根據以上的規則,同樣可以將一顆二叉樹轉換為樹和森林。

5 總結

在數據結構中,估計樹和森林不算很熱門的結構,甚至許多工作過很多年的老碼農都不曾用過。寫這篇文章的時候,我也在想樹和森林到底在實際中有什麼用,似乎最重要的部分就是將一顆普通的樹轉換成二叉樹來處理。但是我想這就是它的價值所在吧。

許多真實場景中,可能數據之間的關係並不能直接通過二叉樹來表示和存儲,一開始可能都需要通過多叉樹或者各種畸形的樹結構來定義關係。這樣的樹肯定是不適用於快速的處理和訪問的,因此往往需要將這些奇形怪狀的樹轉換為規則的二叉樹來進行進一步的處理。最終為了回歸到具體的應用,也需要將二叉樹重新分解為最初的樹或者森林結構來獲得應用意義。

總的來說,存在即是真理。不怕用不到,就怕想不到。

本文轉載自微信公眾號「業餘碼農」,可以通過以下二維碼關注。轉載本文請聯繫業餘碼農公眾號。

【編輯推薦】

【責任編輯:

武曉燕

TEL:(010)68476606】

點讚 0

相關焦點

  • 中國電影森林中最高的樹,如何從北洋軍閥營長家裡誕生?
    【電影皇帝趙丹故居揭秘系列1】趙丹,原名趙鳳翱,祖籍山東肥城,1995年中國電影世紀獎獲得者,2005年中國電影百年百位優秀演員之一,中國電影百年史上十大男明星之一,被上海電影集團總裁任仲倫評價為「中國電影森林中最高的樹」趙丹的父親趙子超,北洋軍閥營長,是軍閥孫傳芳的部下。
  • 382張圖看《三生三世》 「圖解電影」被判侵權 賠償3萬
    8月6日,北京網際網路法院對此案作出一審判決,判定「圖解電影」的行為構成對原告信息網絡傳播權的侵犯,賠償經濟損失3萬元。該案是全國首例涉及將影視作品製作成圖片集方式侵權的案件。在授權期內,原告發現被告在其開發運營的「圖解電影」平臺上的劇集欄目中提供涉案劇集的連續圖集,基本涵蓋了涉案劇集的主要畫面和全部情節,構成侵害原告的信息網絡傳播權。
  • 馬雲的螞蟻森林裡都種了哪些樹?對社會和生態做出了哪些貢獻?
    螞蟻森林種樹的第一站在阿拉善,位於內蒙古自治區,佔地27萬平方公裡,很有幸,唯美君結識螞蟻森林以來的第一棵樹就種在阿拉善螞蟻森林的1號林。阿拉善大部分的地方都是荒漠和戈壁,地理環境惡劣。現在,螞蟻森林的種樹區域還拓展到了鄂爾多斯、庫布其、通遼、巴彥淖爾、赤峰,甘肅武威,河北張家口等地區。
  • 全世界最大的樹:一棵樹組成一片森林,直徑達到500米
    說起森林,大家先想到的是什麼?一般情況下,一片森林都是由成千上萬不同種樹木組成的,作為自然界非常重要的生態圈之一,森林養育了太多的動植物。而大多數森林中的樹木體型比較大,但實際佔地面積卻並不多。但今天我們要介紹的這片森林,它卻只有一棵樹。
  • 同樣是在螞蟻森林養樹,為什麼別人一天能量好幾百?
    比如,支付寶的一項功能——螞蟻森林。用過支付寶螞蟻森林的用戶應該都會知道,通過綠色出行、減少出行、減紙減塑、高效節能、循環利用等方式就能獲得能量,然後收集能量,給樹澆水,到選擇樹種種植成一棵真樹。不少人表示,同樣是在螞蟻森林養樹,為什麼別人一天能量好幾百了?
  • 2020年色盲測試圖,車管所:看不清第4張「樹寶寶」,趁早別開車
    2020 年色盲測試圖,車管所:看不清第4張「樹寶寶」的,趁早別開車!在中國,想要擁有一臺屬於自己的小汽車,國人首先要做的就是把駕照拿到手裡,因為有了駕照,才有資格開車上路,不然,被交警抓到後,會遭到罰款的,所以駕照自然 不能少,可是,現在的駕照是越來越難考了,從剛開始的體驗就是如此,相信有不少國人感受到了,這不已經有不少車主反饋:說2020年色盲測試圖已經出來了,就連車管所都回應:要是看不清第4張「樹寶寶」的,還是勸你趁早別開車了,而接下來就帶大家看一看
  • 螞蟻森林推出4年時間了,如今種了多少樹,沙漠又變成啥樣了?
    大家好,我是和你們一樣愛好娛樂,每天關注娛樂新聞的【張憲政說娛樂】,跟著我帶你們每天看最新資訊。今天,無論是吃喝玩樂,還是衣食住行,「萬物互聯」的時代,我們都可以用手機來預訂,支付,其中,行動支付,網購都是由阿里巴巴創始人馬雲所倡導和推廣的。
  • 螞蟻森林「分手地圖」,愚人節合種愛情樹的人最多
    6月28日,一直以暖心形象出現的螞蟻森林發布了一份扎心報告——《2018上半年度全國分手地圖》,報告顯示,螞蟻森林愛情樹合種功能上線半年,有不少情侶退出合種,還有不少在退出之後換一個對象繼續種樹。網友看後,大呼太扎心,不忍直視。按照螞蟻森林合種規則,愛情樹僅限兩人合種,情侶共同為小樹澆水,累積到一定能量後就能在世界上種下一棵真正的樟子松或者胡楊。
  • 研究:森林裡的樹越高大 生物多樣性就更豐富
    TNC一項新研究表明,生長高大樹木的森林具有更高的生物多樣性,這一研究結果有助於推進自然保護工作。JTB/UIG via Getty Images  在諾亞方舟的故事中,諾亞在面對方舟狹小的空間時作出了正確選擇:他沒用大量漂亮的玄鳳鸚鵡和可愛的小熊貓塞滿船體,而是每種動物都選一公一母進入方舟。我們的保護工作也正面臨著類似的窘境:如何在有限的資源條件下儘可能多地保護生物多樣性?
  • 螞蟻森林推出兩年,馬雲種的樹長什麼樣?網友:這是韭菜吧?
    螞蟻森林推出兩年,馬雲種的樹長什麼樣?網友:這是韭菜吧?當前的網際網路領域,最為突出的兩個企業無疑是騰訊和阿里巴巴了。而作為騰訊和阿里的創始人,馬化騰和馬雲,在整個網際網路領域都是舉足輕重的人物。尤其是馬雲,單論影響力和社會地位而言,馬雲可以說無出其右。
  • 螞蟻森林已推出2年,馬雲承諾種的樹,現在長成什麼樣了?
    導語:螞蟻森林已推出2年,馬雲承諾種的樹,現在長成什麼樣了?馬雲,國內網際網路中的大佬,不僅創立了阿里巴巴,也是支付寶軟體的開發人。馬雲在互聯領域是一位商業奇才,也是眾多成功企業家裡面的領先者,馬雲對社會慈善也是很熱衷的,而這個慈善項目就是支付寶裡面的螞蟻森林。
  • 養發財樹文竹,剪1茬「葉子」翻倍,新芽子嗖嗖竄,變成綠森林
    養發財樹文竹,剪1茬「葉子」翻倍,新芽子嗖嗖竄,變成綠森林養花的時候給花卉澆水、施肥非常關鍵,但是定期修剪花卉也非常的關鍵,否則很多植物容易出現黃葉、乾枯、徒長等情況。今天就給大家分享,在平時養護髮財樹和文竹的時候,大家可以對植株枝條進行重剪,這樣能夠降低營養消耗,讓發財樹和文竹長出更多的新芽,也變成茂密的盆栽。一、養發財樹捨得修剪1、何時修剪?養護髮財樹,一般到了每年春秋兩季,大家可以對植株進行重剪,主要目的是為了去除頂端優勢,讓發財樹長出更多的側枝、新葉。
  • 螞蟻森林推出三年了,馬雲斥資在沙漠種的樹,現在長成什麼樣了?
    導語:螞蟻森林推出三年了,馬雲斥資在沙漠種的樹,現在長成什麼樣了?支付寶的推出我們帶來了很大的方便,同時也讓支付寶增加了更多的用戶量,對於支付寶裡邊的多功能我們都是比較熟悉,當然螞蟻森林也不例外。在16年的時候馬雲的螞蟻森林功能誕生了,還立下承諾就是用戶在這個功能裡種一棵樹,那麼馬雲就會在沙漠裡也種上一棵樹。如今螞蟻森林推出三年了,馬雲斥資在沙漠種的樹,現在長成什麼樣了?
  • 支付寶的螞蟻森林裡面的樹都已經長大了,網友都紛紛曬合照!
    現如今我們處於在一個網絡的時代,人工智慧的時代,我們做的每件小事情都與我們的網際網路相連接,而未來人工智慧和網際網路的發展會越來越迅速,而我們都需要適應時代的發展。今天就來讓小編來說一下支付寶螞蟻森林的事情。
  • 你在支付寶螞蟻森林裡起早貪黑澆水種的樹 現實中長這樣
    你在支付寶螞蟻森林裡起早貪黑澆水種的樹 現實中長這樣  歐洋 • 2017-01-22 16:11:02 來源:前瞻網 E2071G0
  • 天天收能量,你可知螞蟻森林已經種了多少樹了?
    除了捐步數之外,支付寶還有一個公益項目——螞蟻森林,只要你運動或者消費之後支付寶都會給你一些能量,當你的能量把一顆小樹苗培育成一顆參天大樹的時候,支付寶就會真正的在阿拉善地區種一顆屬於你的樹。這真的讓很多人都參與了近來,每天進入支付寶收能量成為日常。螞蟻森林推出的時間也不短了,那麼支付寶究竟種了多少樹了呢?
  • 圖解經典65《圖解周易參同契—認識道藏養生智慧》
    此書融大易、黃老、爐火三家之理於一體,以闡明易理養生的原理和方法。在中國文化思想史和中國科技史上都有非常重要的地位,被公認為最早的易理養生著作。其中有關丹道養生的理論更是中華養生理論中最精華的部分。本書配有300幅精美手繪插圖,100張濃縮精華示意圖,採用了一種全新的」圖解」編輯手法,以現代手法詮釋易理養生絕學,圖解周易參同契,認識道藏養生智慧。可以讓您的閱讀變為一場輕鬆愉快之旅。
  • 五張圖揭秘從懷孕到分娩,子宮變化的全過程,看完真心疼女性
    五張圖為你揭秘,看完不禁心痛女人一萬遍!孕前到分娩子宮變化有多大?懷孕前,女性的子宮形狀就像一個梨子,大小也只有雞蛋一樣大小,長5.5-7.5cm、寬4.5-5.5cm、厚3.0-4.0cm、子宮頸長2.5-3.0cm,體重約40-50g,容積也只7-10ml。
  • 圖解|一張圖帶你了解人口普查的前世今生
    圖解|一張圖帶你了解人口普查的前世今生 2020-10-30 05:30 來源:澎湃新聞·澎湃號·政務
  • 樹是他生命的關鍵詞,為找樹用鐮刀開山路,還遭它叮咬兩次開刀
    現在,又多了林業和歷史——他是中國人文森林學的發起者和實踐者,歷史和林業成為他涉足的新領域。今年8月,梁衡新著《樹梢上的中國》出版。22篇人文古樹散文記錄了從遠古到當代的22棵(種)樹。除兩篇外,均為2010年到2018年間的新作。樹痴一生離不開樹梁衡與樹有緣。他是在樹的懷抱中長大的。在山西當記者時,常跑林業。