数据结构 树(Tree)的基本知识
樹形結(jié)構(gòu)的基本概念
- 節(jié)點(diǎn)(node): 樹上的每一個(gè)元素都是節(jié)點(diǎn)
- 根節(jié)點(diǎn): 一棵樹最頂端的節(jié)點(diǎn)稱為根節(jié)點(diǎn)
- 每棵樹最多有一個(gè)根節(jié)點(diǎn)
- 空樹沒有根節(jié)點(diǎn)
- 父節(jié)點(diǎn): 與一個(gè)節(jié)點(diǎn)直接連接,并且在它的頭上的節(jié)點(diǎn)即是它的父節(jié)點(diǎn)
- 子節(jié)點(diǎn): 與一個(gè)節(jié)點(diǎn)直接連接,并且在它的底下的節(jié)點(diǎn)即是它的子節(jié)點(diǎn)
- 兄弟節(jié)點(diǎn): 與同一個(gè)父節(jié)點(diǎn)直接連接的所有節(jié)點(diǎn)都是兄弟節(jié)點(diǎn)
- 節(jié)點(diǎn)的度(degree): 一個(gè)節(jié)點(diǎn)的子樹的個(gè)數(shù)稱為該節(jié)點(diǎn)的度
- 一個(gè)節(jié)點(diǎn)底下伸出幾個(gè)子節(jié)點(diǎn),該節(jié)點(diǎn)的度就為幾
- 葉子節(jié)點(diǎn)(leaf): 沒有伸出任何子節(jié)點(diǎn)的節(jié)點(diǎn)即為葉子節(jié)點(diǎn)
- 葉子節(jié)點(diǎn)的度為0
- 非葉子節(jié)點(diǎn): 至少有一個(gè)子節(jié)點(diǎn)的節(jié)點(diǎn)即是非葉子節(jié)點(diǎn)
- 非葉子節(jié)點(diǎn)的度不為0
- 空樹: 沒有任何節(jié)點(diǎn)的樹叫做空樹
- 子樹: 分為左子樹和右子樹
- 左子樹: 以左子節(jié)點(diǎn)為根節(jié)點(diǎn)形成的樹稱為左子樹
- 右子樹: 以右子節(jié)點(diǎn)為根節(jié)點(diǎn)形成的樹稱為右子樹
- 樹的度: 樹中所有的節(jié)點(diǎn)的度中,最大值的度即為樹的度
- 層數(shù)(level): 根節(jié)點(diǎn)所在的層數(shù)為第1層,根節(jié)點(diǎn)的子節(jié)點(diǎn)在第2層,依次類推(有的教程是從第0層開始計(jì)算)
- 節(jié)點(diǎn)的深度(depth): 從根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的簡(jiǎn)單路徑上的節(jié)點(diǎn)總數(shù)即為節(jié)點(diǎn)的深度
- 節(jié)點(diǎn)的高度(height): 從當(dāng)前節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的簡(jiǎn)單路徑上的節(jié)點(diǎn)總數(shù)即為節(jié)點(diǎn)的高度
- 樹的高度:?所有節(jié)點(diǎn)高度中的最大值,根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的節(jié)點(diǎn)個(gè)數(shù)
- 樹的深度:?所有節(jié)點(diǎn)中深度的最大值,同樣也是根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的節(jié)點(diǎn)個(gè)數(shù)
- 樹的高度等于樹的深度
- 有序樹(常用): 樹中的任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間有順序關(guān)系,所以不能調(diào)換兄弟節(jié)點(diǎn)的位置. (對(duì)節(jié)點(diǎn)進(jìn)行了排序的樹)
- 無序樹: 樹的任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間沒有順序關(guān)系
二叉樹(Binary Tree)
- 二叉樹的特點(diǎn):
- 所有節(jié)點(diǎn)的最大的度為2(即最多擁有2棵子樹)
- 左子樹和右子樹是有順序的,不能交換左子樹和右子樹的位置
- 即使某節(jié)點(diǎn)只有一棵子樹,也要區(qū)分該子樹是左子樹還是右子樹
- 二叉樹的性質(zhì)
- 非空二叉樹的第i層,最多有2^(i-1)個(gè)節(jié)點(diǎn)(i>=1)
- 在高度為h的二叉樹上最多有2^h - 1個(gè)節(jié)點(diǎn)(h>=1)
- 對(duì)于任意一棵非空二叉樹,如果葉子節(jié)點(diǎn)個(gè)數(shù)為n0,度為2的節(jié)點(diǎn)個(gè)數(shù)為n2,則有: n0=n2+1 (考慮證明方式)
真二叉樹(Proper Binary Tree)?
- 真二叉樹:?所有的節(jié)點(diǎn)的度要么是2,要么是0,度不能為1
滿二叉樹(Full Binary Tree)
- 所有的節(jié)點(diǎn)的度要么是2,要么是0,且所有的葉子節(jié)點(diǎn)都在最后一層(即每層節(jié)點(diǎn)都滿排布)
? 滿二叉樹的特點(diǎn):
? ? ?? ?滿二叉樹一定是真二叉樹,但是真二叉樹不一定是滿二叉樹
?? ??? ?假設(shè)滿二叉樹的高度和h(h>=1),那么
? ? ? ? 1, 第i層的節(jié)點(diǎn)數(shù): 2^(i-1)
? ? ? ? 2, 葉子節(jié)點(diǎn)的數(shù)量: 2^(h-1)
? ? ? ? 3, 總節(jié)點(diǎn)的個(gè)數(shù) n = 2^h - 1 (推論: 滿二叉樹的高度: h= log2(n+1))
完全二叉樹(Complete Binary Tree)
- 葉子節(jié)點(diǎn)只會(huì)出現(xiàn)在最后2層,且最后1層的葉子節(jié)點(diǎn)都是靠左對(duì)齊
?完全二叉數(shù)的特點(diǎn):
?? ?1,完全二叉樹的節(jié)點(diǎn)從上到下,從左到右依次滿排布(偽滿二叉樹),如果排布滿了就是滿二叉樹
? ? 2,完全二叉樹從根節(jié)點(diǎn)到倒數(shù)第2層的所有節(jié)點(diǎn)組成的樹是一棵滿二叉樹
? ? 3,滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹
完全二叉樹的性質(zhì):
?? ?1,度為1的節(jié)點(diǎn)的子樹只能是左子樹不能是右子樹
? ? 2,度為1的節(jié)點(diǎn)要么是1個(gè),要么是0個(gè)
? ? 3,同樣節(jié)點(diǎn)數(shù)量的二叉樹,完全二叉樹的高度最小
? ? 4,假如完全二叉樹的高度為h(h>=1),那么最少有 2^(h-1)個(gè)節(jié)點(diǎn),最多有2^h -1個(gè)節(jié)點(diǎn)
? ? 5,完全二叉樹的總結(jié)點(diǎn)數(shù)量為n,高度為h,那么2^(h-1)<= n < 2^h 取對(duì)數(shù)之后:h-1<= log2(n) < h
? ? ? ? 可推導(dǎo)出: log2(n)< h <= log2(n)+1,又由于h為整數(shù)
? ? ? ? 可推導(dǎo)出: h = floor(log2(n))+1 ?注意: floor()向下取整, ceiling向上取整
證明: 如果完全二叉樹的總結(jié)點(diǎn)是n, 當(dāng) n為偶數(shù)時(shí), 葉子節(jié)點(diǎn)數(shù)量 n0 = n /2 , 當(dāng)n為奇數(shù)時(shí), 葉子節(jié)點(diǎn)數(shù)量 n0 = (n + 1) / 2 ?
二叉查找樹(Binary Search Tree) (二叉搜索樹)
二叉查找樹的特點(diǎn):
?? ?1,每一個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn)(滿足二叉樹特點(diǎn))
?? ?2,任何一個(gè)節(jié)點(diǎn)的左子節(jié)點(diǎn)都比自己小,右子節(jié)點(diǎn)都比自己大
? ? 3,任何一個(gè)節(jié)點(diǎn)的左右子樹都是二叉搜索樹
二叉查找樹存儲(chǔ)的元素必須具備可比較性:
?? ?1,自定義類型必須指定比較方式,不允許為null(null類型沒法比較)
平衡二叉樹
平衡二叉樹的特點(diǎn):
?? ?1,二叉樹的左子樹和右子樹高度差不超過1
? ? 2,任意節(jié)點(diǎn)的左子樹和右子樹都是一棵平衡二叉樹
紅黑樹(平衡二叉B樹)
- 紅黑樹是一種自平衡的二叉查找樹,是計(jì)算機(jī)科學(xué)中用到的一種數(shù)據(jù)結(jié)構(gòu),紅黑樹不是高度平衡的,它的平衡是通過"紅黑規(guī)則"實(shí)現(xiàn)的
紅黑樹和平衡二叉樹之間的區(qū)別:
?? ?平衡二叉樹是高度平衡的,當(dāng)平衡二叉樹的左子樹和右子樹高度差超過1時(shí),就會(huì)通過旋轉(zhuǎn)來達(dá)到再次平衡
? ? 紅黑樹不是高度平衡的,只有當(dāng)不滿足"紅黑規(guī)則"時(shí)才會(huì)旋轉(zhuǎn)
- 紅黑規(guī)則
?1,每一個(gè)節(jié)點(diǎn)要么是紅色要么是黑色的
?2,根節(jié)點(diǎn)必須是黑色的
?3,如果一個(gè)節(jié)點(diǎn)沒有子節(jié)點(diǎn),則該節(jié)點(diǎn)里面的指向子節(jié)點(diǎn)的指針屬性值為Nil,這個(gè)Nil視為葉子節(jié)點(diǎn),每個(gè)葉子節(jié)點(diǎn)(Nil)是黑色的
?4,如果某一個(gè)節(jié)點(diǎn)是紅色的,那么它的子節(jié)點(diǎn)必須是黑色的(即不能出現(xiàn)兩個(gè)紅色節(jié)點(diǎn)相連接的情況)
?5,對(duì)于每一個(gè)節(jié)點(diǎn),從該節(jié)點(diǎn)到其所有后代葉子節(jié)點(diǎn)的簡(jiǎn)單路徑上,均包含相同數(shù)目的黑色節(jié)點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的数据结构 树(Tree)的基本知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加速度计-压阻式简介
- 下一篇: python打包工具报错_Pyinsta