一、什麼是樹
客觀世界中許多事物存在層次關係
人類社會家譜社會組織結構圖書資訊管理
其中,人類社會家譜如下圖所示:
通過上述所說的分層次組織,能夠使我們在資料的管理上有更高的效率!那麼,對於資料管理的基本操作——查詢,我們如何實現有效率的查詢呢?
二、查詢
查詢:根據某個給定關鍵程式設計客棧字k,從集合r中找出關鍵字與k相同的記錄
靜態查詢:集合中記錄是固定的,即對集合的操作沒有插入和刪除,只有程式設計客棧查詢
動態查詢:集合中記錄是動態變化的,即對集合的操作既有查詢,還可能發生插入和刪除(動態查詢不在我們考慮範圍內)
2.1 靜態查詢 2.1.1 方法1:順序查詢
/* c語言實現 */
int sequentialsearch (statictable *tbl, elementtype k)
順序查詢演算法的時間複雜度為o(n)
2.1.2 方法2:二分查詢(binary search)
假設n個資料元素的關鍵字滿足有序(比如:小到大),即\(k_1
例:假設有13個資料元素,按關鍵字由小到大順序存放。二分查詢關鍵字為444的資料元素過程如下圖:
仍然以上面13個資料元素構成的有序線性表為例,二分查詢關鍵字為43的資料元素如下圖:
/* c語言實現 */
int binarysearch (statictable *tbl, elementtype k)
return notfound; // 查詢不成功,返回-1
}# python語言實現
def binary_chop(alist, data):
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return true
return false
二分查詢演算法具有對數的時間複雜度o(logn)
二分查詢演算法雖然解決了查詢的時間複雜度問題,但是對於資料的插入和刪除確是o(n)的,因此有沒有一種資料結構,既可以減少資料查詢的時間複雜度,又可以減少資料的插入和刪除的複雜度呢?
三、二分查詢判定樹
除了使用上述兩個方法進行關鍵字的查kqijmxr找,我們還可以通過二叉樹這種資料結構完成關鍵字的查詢。
從上圖可以看出,如果我們需要尋找數字8,可以通過以下4步實現(可能看不懂,未來會看得懂):
根節點6小於8,往6的右子節點9找結點9大於8,往9的左子結點7找結點7小於8,往7的左子結點找找到8 判定樹上每個結點需要的查詢次數剛好為該結點所在的層數;查詢成功時查詢次數不會超過判定樹的深度 n個結點的判定樹的深度為\([log_2]+1\) \(asl = (4*4+4*3+2*2+1)/11 = 3\) 四、樹的定義
樹(tree):\(n(n\geq)\)個結點構成的有限集合。
當n=0時,稱為空樹對於任一顆非空樹(n>0),它具備以下性質: 樹中有乙個稱為根(root)的特殊結點,用r表示其餘結點可分為m(m>0)個互不相交的有限集\(t_1,t_2,\cdots,t_m\),其中每個集合本身又是一棵樹,稱為原來樹的子樹(subtree)
五、樹與非樹
牢記樹有以下3個特性:
子樹是不相交的;除了根結點外,每個結點有且僅有乙個父結點;一顆n個結點的樹有n-1條邊 5.1 非樹
5.2 樹
六、樹的一些基本術語
結點的度(degree):結點的子樹個數樹的度:樹的所有結點中最大的度數葉結點(leaf): 度為0的結點父結點(parent):有子樹的結點是其子樹的根結點的父結點子結點(child):若a結點是b結點的父結點,則稱b結點是a結點的子結點;子結點也稱孩子結點
兄弟結點(sib程式設計客棧ling):具有同一父結點的各結點彼此是兄弟結點
路徑和路徑長度:從結點\(n_1\)到\(n_k\)的路徑為乙個結點序列\(n_1 , n_2 ,\cdots, n_k\) , \(n_i\)是\(n_\)的父結點。路徑所包含邊的個數為路徑的長度
祖先結點(ancestor):沿樹根到某一結點路徑上的所有結點都是這個結點的祖先結點
子孫結點(descendant):某一結點的子樹中的所有結點是這個結點的子孫
結點的層次(level):規定根結點在1層,其它任一結點的層數是其父結點的層數加1
樹的深度(depth):樹中所有結點中的最大層次是這棵樹的深度
七、樹的表示
7.1 樹的鍊錶表示
上圖所示樹的鍊錶表示法有很大的缺陷,假設樹的深度非常大,並且不能保證所有樹的子結點都有3個,那麼會造成很大程度的浪費。
7.2 樹的鍊錶(兒子-兄弟)表示法
為了解決樹的普通鍊錶表示會有空間的浪費的缺陷,我們可以把鍊錶的指標設定兩個鏈結,乙個鏈結指向兒子結點,另乙個鏈結指向兄弟結點,如下圖所示:
上圖所示的樹的表示方法,已經足夠完美了,但是如果我們把鍊錶表示的樹旋轉45角,會發現如下圖所示:
經過45角的旋轉,我們會發現一顆二叉樹(一www.cppcns.com個結點至多擁有2個子結點的樹),也就是說最普通的樹其實可以通過二叉樹表示,也就是說我們只要把二叉樹研究透了,我們即研究透了樹。
4 樹 樹的表示
根據某個給定關鍵字k,從集合r中找出關鍵字與k相同的記錄 int sequentialsearch statictable tbl,elementtype k return 1 順序查詢演算法的時間複雜度為o n 假設n個資料元素的關鍵字滿足有序 比如 小到大 k 1 le k 2 le le k ...
樹和樹的表示
part1 樹 在現實生活中,有很多具有層次的關係。層次管理具有很高的效率。在計算機中也是一樣,樹就實現了計算機中的層次,在查詢修改資訊方面提供了很大的方便。之前在學習離散數學時已經對樹有了了解,所以這裡理解起來很容易。樹的定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹。對於任意一棵非...
樹的表示方法
順序儲存 查指定結點的雙親方便,指定結點的孩子則需要從頭遍歷 根節點固定儲存在0,且 1表示沒有雙親 define max tree size 100 typedef struct ptnode typedef struct ptree 順序 鏈式儲存 struct ctnode typedef s...