資料結構與演算法筆記——樹(Tree)
什麼是樹
樹的一些概念
根節點、葉子節點、父節點、子節點、兄弟節點,還有節點的高度、深度以及層數,樹的高度。
你有沒有發現, "樹"這種資料結構真的很像我們現實生活中的"樹" ,這裡面每個元素我們叫作"節點" ;用來連線相鄰節點之間的關係,我們叫作"父子關係"。
比如下面這幅圖, A節點就是B節點的父節點, B節點是A節點的子節點。 B.C、D這三個節點的父節點是同一個節點,所以它們之間互稱為兄弟節點。我們把沒有父節點的節點叫作根節點,也就是圖中的節點E,我們把沒有子節點的節點叫作葉子節點或者葉節點,比如圖中的G、H、1、J、葉子書。
節點的高度 = 節點到葉子書點的最長路徑(邊數)
節點的深度 = 根節點到這個節點所經歷的邊的個數
節點的層數 = 節點的深度+1
樹的高度 = 根節點的高度
層數:數節點,高度從下往上數變數,深度從上往下數變數
二叉樹(Binary Tree)
什麼是二叉樹:
每個節點最多有兩個"叉" ,也就是兩個子節點,分別是左子節點和右子節點。
編號2 的二叉樹中,葉子節點全都在最底層,除了葉子節點之外,每個節點都有左右兩個於節點,這種二叉樹就叫作滿二叉樹。
編號3 的二叉樹中,葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後層,其他層的節點個數都要達到最大,這種二叉樹叫作完全二叉樹。
二叉樹的遍歷:
- 前序遍歷是指,對於樹中的任意節點來說,先列印這個節點,然後再列印它的左子樹,最後列印它的右子樹。自左右
- 中序遍歷是指,對於樹中的任意節點來說,先列印它的左子樹,然後再列印它本身,最後列印它的右子樹。左自右
- 後序遍歷是指,對於樹中的任意節點來說,先列印它的左子樹,然後再列印它的右子樹,最後列印這個節點本身。左右自
二叉查詢樹
什麼是二叉查詢樹:
二叉查詢樹是二叉樹中最常用的一種型別,也叫二叉搜尋樹。顧名思義,二叉查詢樹是為了實現快速查詢而生的。不過,它不僅僅支援快速查詢一個數據,還支援快速插入、刪除一個數據。
二又查詢樹要求,在樹中的任意一個節點,其左子樹中的每個節點的值,都要小於這個節點的值,而右子樹節點的值都大於這個節點的值。
平衡二叉查詢樹
什麼是平衡二叉查詢樹:
二叉樹中任意一個節點的左右子樹的高度相差不能大於1。
常見的平衡二叉查詢樹:
Splay Tree (伸展樹) 、Treap (樹堆)等,但是我們提到平衡二叉查詢樹,聽到的基本都是紅黑樹。
紅黑樹
紅黑樹的英文是"Red-Black Tree" ,簡稱R-B Tree。它是一種不嚴格的平衡二叉查詢樹
紅黑樹的特點:
- 根節點是黑色的;
- 每個葉子節點都是黑色的空節點(NIL) ,也就是說,葉子節點不儲存資料;
- 任何相鄰的節點都不能同時為紅色,也就是說,紅色節點是被黑色節點隔開的;
- 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;