圖解數據結構(05) -- 二叉樹

1、什麼是樹

在數據結構中,樹的定義如下:
樹(tree)是 n(n≥0)個節點的有限集,當n=0時,稱爲空樹,在任意一個非 空樹中,有如下特點:

  • 有且僅有一個特定的稱爲根的節點;
  • 當n>1時,其餘節點可分爲m(m>0)個互不相交的有限集,每一個集合本身又是一個樹,並稱爲根的子樹
    下面這張圖,就是一個標準的樹結構:
    在這裏插入圖片描述
    在上圖中,節點1是根節點(root);節點5、6、7、8是樹的末端,沒有孩子,被稱爲葉子節點(leaf);圖中的虛線部分,是根節點1的其中一個子樹,同時,樹的結構從根節點到葉子節點,分爲不同的層級;從一個節點的角度來看,它的上下級和同級節點關係如下:
    在這裏插入圖片描述
    在上圖中,節點4的上一級節點,是節點4的父節點(parent);從節點4衍生出 來的節點,是節點4的孩子節點(child);和節點4同級,由同一個父節點衍生出來 的節點,是節點4的兄弟節點(sibling);樹的最大層級數,被稱爲樹的高度或深度。【上圖這個樹的高度是4】

2、什麼是二叉樹

二叉樹(binary tree)是樹的一種特殊形式;顧名思義,這種樹的每 個節點最多有2個孩子節點【這裏是最多有2個,也可能只有1個,或者沒有孩子節點】二叉樹的結構如圖所示:
在這裏插入圖片描述
二叉樹節點的兩個孩子節點,一個被稱爲左孩子(left child),一個被稱爲右孩子(right child);
這兩個孩子節點的順序是固定的,就像人的左手就是左手,右手就是右手,不能夠顛倒或混淆,此外,二叉樹還有兩種特殊形式,一個叫作滿二叉樹,另一個叫作完全二叉樹!

滿二叉樹

一個二叉樹的所有非葉子節點都存在左右孩子,並且所有葉子節點都在同一層 級上,那麼這個樹就是滿二叉樹,如下圖:【滿二叉樹的每一個分支都是滿的】
在這裏插入圖片描述

完全二叉樹

對一個有n個節點的二叉樹,按層級順序編號,則所有節點的編號爲從1到n;如果這個樹所有節點和同樣深度的滿二叉樹的編號爲從1到n的節點位置相同,則這個二叉樹爲完全二叉樹,如下圖:
在這裏插入圖片描述
在上圖中,二叉樹編號從1到12的12個節點,和前面滿二叉樹編號從1到12的節點位置完全對應,因此這個樹是完全二叉樹;完全二叉樹的條件沒有滿二叉樹那麼苛刻:滿二叉樹要求所有分支都是滿的; 而完全二叉樹只需保證最後一個節點之前的節點都齊全即可。

二叉樹的物理存儲結構

鏈式存儲結構

鏈式存儲是二叉樹最直觀的存儲方式,如下圖:
在這裏插入圖片描述
一個節點最多可以指向左右兩個孩子節點,所以二叉樹的每一個節點包含3部分:

  • 存儲數據的data變量
  • 指向左孩子的left指針
  • 指向右孩子的right指針

數組存儲結構

使用數組存儲時,會按照層級順序把二叉樹的節點放到數組中對應的位置上; 如果某一個節點的左孩子或右孩子空缺,則數組的相應位置也空出來
在這裏插入圖片描述
這樣可以更方便地在數組中定位二叉樹的孩子節點和父節點;假設一個父節點的下標是parent,那麼它的左孩子節點下標就是2×parent + 1;右孩子節點下標就是2×parent + 2;反過來,假設一個左孩子節點的下標是leftChild,那麼它的父節點下標就是 (leftChild-1)/ 2;
假如節點4在數組中的下標是3,節點4是節點2的左孩子,節點2的下標可以直接通過計算得出:

節點2的下標 = (3-1)/2 = 1

顯然,對於一個稀疏的二叉樹來說,用數組表示法是非常浪費空間的

3、二叉樹的應用

二叉樹包含許多特殊的形式,每一種形式都有自己的作用,但是其最主要的應用還在於進行查找操作維持相對順序這兩個方面

【1】查找

二叉樹的樹形結構使它很適合扮演索引的角色:二叉查找樹(binary search tree),這種二叉樹的主要作用就是進行查找操作;二叉查找樹在二叉樹的基礎上增加了以下幾個條件:

  • 如果左子樹不爲空,則左子樹上所有節點的值均小於根節點的值
  • 如果右子樹不爲空,則右子樹上所有節點的值均大於根節點的值
  • 左、右子樹也都是二叉查找樹

下圖就是一個標準的二叉查找樹:
在這裏插入圖片描述
例如查找值爲4的節點,步驟如下:

  • 1、訪問根節點6,發現4<6;
    在這裏插入圖片描述
  • 2、訪問節點6的左孩子節點3,發現4>3;
    在這裏插入圖片描述
  • 3、訪問節點3的右孩子節點4,發現4=4,這正是要查找的節點
    在這裏插入圖片描述
    對於一個節點分佈相對均衡的二叉查找樹來說,如果節點總數是n,那麼搜索節點的時間複雜度就是O(logn),和樹的深度是一樣的。

【2】 維持相對順序

二叉查找樹要求左子樹小於父節點,右子樹大於父節點,正是這樣保證了二叉樹的有序性;新插入的節點,同樣要遵循二叉排序樹的原則;例如插入新元素5,由於5<6, 5>3,5>4,所以5最終會插入到節點4的右孩子位置。
在這裏插入圖片描述
再如插入新元素10,由於10>6,10>8,10>9,所以10最終會插入到節點9的右孩子位置
在這裏插入圖片描述
這一切看起來很順利,然而卻隱藏着一個致命的問題;試着在二叉查找樹中依次插入9、8、7、6、5、4,結果如下:
在這裏插入圖片描述
要解決這個問題就要涉及二叉樹的自平衡,二叉樹自平衡的方式有多種:如紅黑樹、AVL樹、樹堆等
—————————————————————————————————————————————
內容來源:《漫畫算法》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章