程序的好壞一般來說有2個標準,一個是時間複雜度,一個是空間複雜度。時間複雜度說的是程序運行的時間;空間複雜度說的是程序的內存佔用的多少。
而數據結構就是爲了解決時間複雜度的,或者說一個好的數據結構(算法)可以節省程序運行的時間。
線性結構
顧名思義,線性表是一條線的。首先要稍稍提一下,數據結構的存儲只有數組(Array)和鏈表(Linklist)2種方式來實現。任何的數據結構都會涉及到創建,插入,刪除這幾個操作
所以線性表同樣的,可以由數組和鏈表來實現。其中線性表又分爲2種形式一種叫堆棧(Stack),一種叫隊列(Queue)。
堆棧
堆棧的特點是先進後出,後進先出。它的實現就是普通的數組和單向鏈表。
隊列
隊列的特點是先進先出,後進後出。就像排隊一樣。實現方法也是普通的數組和單向鏈表。只是思路變換了,不是什麼大難題。
接下來纔是我想特別寫的樹(tree)
樹
樹的開始,我們來先說說二分查找https://baike.baidu.com/item/二分查找/10628618?fr=aladdin(我相信百度會比我說的好的)
二分查找的前提條件是這一堆數據必須是順序存儲,升序降序都可以,但是必須要順序。然後每次都拿中間項與查找項比較。
二分查找的優勢在於,它100%能排除到一半的數據,所以相比於堆棧和隊列的查找方式會快很多。 那麼通過二分查找來引出我們的
樹,
通過二分查找你有沒有發現,不管查找了多少次,查找的方向是左還是右,都是按照一定的規律進行的。我們來畫一個圖就看看
我們查找2和5就一定會在第2次找到,我們要找1,4,6就一定會在第3次找到。也就是說在二分查找中,某個數據被查找的次數是固定的。而這樣一個圖是不是很像一個樹呢?其實這就是樹。
樹的概念
每一個元素都稱爲結點(node)(後面改了,下面的節點全部當成結點對待O(∩_∩)O)
樹和子樹
根:根是一個相對概念,比如對2節點和5節點來說他們的根就是3節點。1節點的根就是2節點。4節點和6節點的根是5節點。
邊:就是上面的藍色箭頭。一個擁有N個節點的樹有N-1條邊。
結點的層次:根結點的層次爲1,其餘結點的層次爲父結點層次+1 。
子樹:子樹同樣也是一棵樹,所以他們也擁有自己的根。每個子樹是互不相交的,如果子樹之間相交則不能稱之爲樹。除了根節點以外,每個節點只有一個父節點。
節點的度:一個節點的子樹個數。
樹的度:一棵樹中最大的節點的度作爲樹的度。例如上面,3節點的度是2。2節點的度是1。5節點的度是2 。所以這棵樹的度是2
葉節點:度爲0的節點。用人話來說就是層次最低的節點。->1,4,6這幾個就是葉節點。
父子節點:這是一個相對概念,需要注意的是父子關係只存在於相鄰的上下層次間。比如3是5的父節點,而不是4or6的父節點。
兄弟節點:在同一層次的節點稱爲兄弟節點。
路徑和路徑的長度:就是某一個節點沿着層層父節點往上走的軌跡。經過的箭頭就是該路徑的長度。
祖先節點:與父子節點類似,沿着一條向上的路徑,該路徑上所以的節點都是出發點的祖先節點。
子孫節點:沿着一條向下的路徑,該路徑所以的節點都是出發點的子孫節點。
樹的深度:樹的所有結點中最大的層次。
二叉樹:
簡單來說,一個node裏含有數據域和指針域(含有1個FirstChild指針和1個NextSibling指針)
二叉樹的種類
無序樹,有序樹,完全二叉樹,滿二叉樹。
完全二叉樹:
除了葉結點外,其餘結點的指針域都不是NULL;
滿二叉樹:
是從完全二叉樹衍生的一種樹,滿二叉樹只能缺少葉結點。