開啟「樹」之旅

2022-06-09 13:21:10 字數 2649 閱讀 1675

--**啊哈磊【坐在馬桶上看演算法】演算法9:開啟「樹」之旅

我們先來看乙個例子。

這是什麼?是乙個圖?不對,確切的說這是一棵樹。這**像樹呢?不要著急我們來變換一下。

是不是很像一棵倒掛的樹,也就是說它是樹朝上, 而葉子朝下的。不像?哈哈,看完下面這幅圖你就會覺得像啦。

你可能會問:樹和圖有什麼區別?這個稱之為樹的東西貌似和無向圖差不多嘛。不要著急,繼續往下看。樹其實就是不包含迴路的連通無向圖。你可能還是無法理解這其中的差異,舉個例子,如下。

上面這個例子中左邊的是一棵樹,而右邊的是乙個圖。因為左邊的沒有迴路,而右邊的存在1->2->5->3->1這樣的迴路。

正是因為樹有著「不包含迴路」這個特點,所以樹就被賦予了很多特性。

一棵樹中的任意兩個結點有且僅有唯一的一條路徑連通。

一棵樹如果有n個結點,那麼它一定恰好有n-1條邊。

在一棵樹中加一條邊將會構成乙個迴路。樹這個特殊的資料結構在**會用到呢?比如足球世界盃的晉級圖,家族的族譜圖、公司的組織結構圖、書的目錄、我們用的作業系統windows、liunx或者mac中的「目錄(資料夾)」都是一棵樹。下面就是「啊哈c」這個軟體的目錄結構。

1

c:\啊哈c

2├─codes

3├─core

4│ ├─bin

5│ ├─include

6│ │ ├─ddk

7│ │ ├─gdb

8│ │ ├─gdiplus

9│ │ ├─gl

10│ │ └─sys

11│ ├─lib

12│ │ └─gcc

13│ │ └─mingw32

14 │ │ └─4.7.1

15│ │ ├─finclude

16│ │ ├─include

17│ │ │ └─ssp

18 │ │ ├─include-fixed

19 │ │ └─install-tools

20│ │ └─include

21│ ├─libexec

22│ │ └─gcc

23│ │ └─mingw32

24 │ │ └─4.7.1

25 │ │ └─install-tools

26│ └─mingw32

27│ ├─bin

28│ └─lib

29│ └─ldscripts

30 └─skin

假如現在正處於libexec資料夾下,需要到gdiplus資料夾下。你必須先「向上」回到上層資料夾core,再進入include資料夾,最後才能進入gdiplus資料夾。因為一棵樹中的任意兩個結點(這裡就是資料夾)有且僅有唯一的一條路徑連通。

為了之後講解的方便,我們這裡對樹進行一些定義。

首先,樹是指任意兩個結點間有且只有一條路徑的無向圖。 或者說,只要是沒有迴路的連通無向圖就是樹。

為了確定一棵樹的形態,在一棵樹中可以指定乙個特殊的結點——根。我們在對一棵樹進行討論的時候,將樹中的每個點稱為結點,有的書中也稱為節點。有乙個根的樹叫做有根樹(哎,這不是廢話嘛)。比如上方左邊這棵樹的樹根是1號結點,右邊這棵樹的樹根是3號結點。

根又叫做根結點,一棵樹有且只有乙個根結點。根結點有時候也稱為祖先。既然有祖先,理所當然就有父親和兒子。比如上圖右邊這棵樹中3號結點是1、6和7號結點的父親,1、6和7號結點是3號結點的兒子。同時1號結點又是2號結點的父親,2號結點是1號結點的兒子,2號結點與4、5號結點關係也顯而易見了。 

父親結點簡稱為父結點,兒子結點簡稱為子結點。2號結點既是父結點也是子結點,它是1號結點的子結點,同時也是4和5號結點的父結點。另外如果乙個結點沒有子結點(即沒有兒子)那麼這個結點稱為葉結點,例如4、5、6和7號結點都是葉結點。

沒有父結點(即沒有父親)的結點稱為根結點(祖先)。如果乙個結點既不是根結點也不是葉結點則稱為內部結點。最後每個結點還有深度,比如5號結點的深度是4。哎,終於囉嗦完了,寫的我汗都流出來了,沒有理解的請看下面這幅插圖吧。

說了這麼多你可能都沒有感受到樹究竟有什麼好處。不要著急,請看下回——二叉樹。

開啟「樹」之旅

我們先來看乙個例子。這是什麼?是乙個圖?不對,確切的說這是一棵樹。這 像樹呢?不要著急我們來變換一下。是不是很像一棵倒掛的樹,也就是說它是根朝上,而葉子朝下的。不像?哈哈,看完下面這幅圖你就會覺得像啦。你可能會問 樹和圖有什麼區別?這個稱之為樹的東西貌似和無向圖差不多嘛。不要著急,繼續往下看。樹其實...

開啟Ionic之旅

貼出ionic官網 ionic是優雅 開源的前端sdk,使用web技術來開發跨平台的手機移動應用。一.安裝 首先,安裝node.js,然後安裝cordova和ionic命令列工具,然後個閱讀指南安裝android和ios相應平台的依賴項。如果之前沒有安裝好cordova命令列工具,執行下面命令 np...

開啟部落格之旅

之前一直很排斥這個東西,因為不想要去寫。後來才慢慢地意識到其實記錄一下自己的歷程 自己大學所經歷的事情 以及自己在學習當中遇到的困難,怎麼解決的一方面可以去提公升一下自己的歸納能力,以及可以為同樣正在學習以及剛開始學習的指明一條道路,不會讓走太多的彎路。wwh的學習方式一種很重要的方式 所謂wwh學...