一、前言
前面我們已經介紹了很多種線性的資料結構,今天就來介紹一種新的資料結構 — 樹,樹是一種非線性的資料結構,由 n 個有限結點組成乙個具有層次關係的集合.
二、關於樹的一些概念
節點的度 : 乙個節點含有的子樹的個數稱為該節點的度
樹的度 : 一棵樹中最大的節點的度稱為樹的度
葉子節點/終端節點 : 度為0的節點就是葉子節點
雙親節點/父節點 : 乙個節點含有子節點,則這個節點就是其子節點的父節點
孩子節點/子節點 : 乙個節點含有的子樹的根節點稱為該節點的子節點
根節點 : 一棵樹中沒有雙親節點的節點
節點的層次 : 根據我們對根節點的定義不同,如果把根節點看作第一層,根節點的子節點就是第2層,以此類推
樹的深度/高度 : 樹中節點的最大層次
非終端節點 : 度不為0的節點(有分支)
兄弟節點 : 具有相同父節點的節點互稱兄弟節點
堂兄弟節點 : 雙親在同一層的節點稱為堂兄弟節點
節點的祖先 : 從根到該節點所經分支上的所有節點
子孫 : 以某節點為根的子樹中的任一節點都稱為該節點的子孫
森林 : 由m(m>=0)棵互不相交的樹的集合稱為森林
三、樹的表示形式
3.1 樹的特點
1.子樹不相交
2.除了根節點外,每個節點有且僅有乙個父節點
3.一顆n個節點的樹有n-1條邊
4.如果某個節點有多個父節點 此時就不再是樹形結構 而是"圖"
5.樹中任意乙個節點,都可以看成是乙個樹 子樹
3.2 表示方法
雙親表示法、孩子表示法、孩子兄弟表示法等
例:孩子兄弟表示法的節點
class
node
四、二叉樹的基本概念
4.1 二叉樹的特點
一顆二叉樹是節點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩棵左子樹和右子樹的二叉樹組成
1.每個節點最多有兩棵子樹,即二叉樹不存在度大於2的節點
2.二叉樹的子樹有左右之分,次序不能顛倒
4.2 二叉樹的基本形態
1.空樹
2.無子節點,只有乙個根節點
3.只有右子樹
4.只有左子樹
5.左右子樹都有
4.3 特殊的二叉樹
1.完全二叉樹 : 對於深度為k的,有n各節點的二叉樹,當且僅當其每乙個節點都與深度為k的滿二叉樹中編號從1至n的節點一一對應時稱為完全二叉樹
2.滿二叉樹 : 滿二叉樹就是一種特殊的完全二叉樹,如果每乙個層的節點數都達到最大值,那這個二叉樹就是滿二叉樹,存在這樣乙個數學邏輯 : 如果乙個二叉樹層數為k,且節點總數是(2^k)-1
五、二叉樹的遍歷
5.1 遍歷方式
前面我們看到的順序表,鍊錶遍歷很簡單,但這裡的二叉樹不是線性結構了,要約定一定遍歷順序,如下:
1.先序遍歷/前序遍歷 : 訪問根節點的操作在遍歷其左右子樹之前(nlr)
2.中序遍歷 : 訪問根節點的操作發生在遍歷左右子樹之間(lnr)
3.後序遍歷 : 訪問根節點的操作發生在遍歷左右子樹之後(lrn)
4.層序遍歷 : 一層一層從上往下 每一層從左往右
5.2 遍歷**實現
二叉樹的表示通常是"左右孩子表示法",這裡的遍歷是指把每乙個資料都訪問(和具體的問題場景相關 可以是列印,比較,修改,複雜計算,建立節點,刪除節點等)一遍,做到不重不漏
public
class
tree
@override
public string tostring()
';}}
static node build()
/** * 前中後序遍歷
* @param root
*/public
static
void
preorder
(node root)
system.out.
print
(root.val+
" ")
;preorder
(root.left)
;preorder
(root.right);}
public
static
void
inorder
(node root)
inorder
(root.left)
; system.out.
print
(root.val+
" ")
;inorder
(root.right);}
public
static
void
posorder
(node root)
posorder
(root.left)
;posorder
(root.right)
; system.out.
print
(root.val+
" ");}
}
在我們寫二叉樹的遍歷過程中用到了遞迴的思想,在之後的二叉樹的高階操作和基礎操作中都會用到這樣的方式,在這裡我們要注意:
1.遞迴執行過程中需要乙個額外的空間來儲存當前遞迴的呼叫關係(棧) 維護乙個棧
2.先序遍歷第乙個元素一定是根節點
3.中序遍歷列印出的第乙個值是最左側的節點,左右子樹中序遍歷結果正好在根節點的左右兩側
4.後序遍歷的最後乙個元素一定是根節點,並且逆序的後序遍歷正好遵循了nrl這樣的規則
5.層序遍歷由於他的遍歷特點,不需要使用遞迴這樣的思想,具體的實現**在之後的部落格再進行仔細的講解~
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
二叉樹基礎 遍歷
每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。滿二叉樹 所有終端都在同一層次,且非終端結點的度數為2。在滿二叉樹中若其深度為h,則其所包含的結點數必為2 h 1。完全二叉樹 除了最大的層次即成為一顆滿二叉樹且層次最大那層所有的結點均向左靠齊,即集中在左面的位置上,不能有空位置。對於完全二叉...
樹 與 二叉樹 的遍歷
樹也是圖,遍歷方法自然也分為廣度優先和深度優先。但對於樹,由於結點的排序有規則,所以其遍歷結果產生唯一的結點序列,而不像 圖 那樣產生多種可能的結果。1 廣度優先遍歷 自根部向下,依次訪問完第一層的所有結點後,然後逐層訪問各子樹上同一層次的所有結點,以此類推,直至 最大深度上的結點都訪問完畢為止。層...