數據結構(三)二叉樹及存儲結構

定義

  二叉樹TT:一個有窮的結點集合。這個集合可以爲空,若不爲空,則它是由根結點和稱爲其左子樹TLT_{L}右子樹TRT_{R}的兩個不相交的二叉樹組成。

  有五種基本的形式:

  1. 空樹。
  2. 只有一個節點。
  3. 有一個節點,只有左子樹,右子樹爲空。
  4. 有一個節點,左子樹爲空,右子樹不爲空。
  5. 左右子樹都不爲空。

  具體如下圖所示:

二叉樹的五種基本表現形式

  這裏需要注意的是:二叉樹與度爲2的樹的區別在於二叉樹有左右之分。

特殊二叉樹

  有三種特殊的二叉樹,斜二叉樹完美二叉樹完全二叉樹

  • 斜二叉樹(Skewed Binary Tree)

斜二叉樹

  • 完美二叉樹(Perfect Binary Tree)

  完美二叉樹(Perfect Binary Tree)也稱作滿二叉樹(Full Binary Tree

滿二叉樹

  • 完全二叉樹(Complete Binary Tree)

  有nn個結點的二叉樹,對樹中結點按從上至下、從左到右順序進行編號,編號爲i1ini(1 ≤ i ≤ n)結點與滿二叉樹中編號爲 ii 結點在二叉樹中位置相同。

非完全二叉樹舉例

二叉樹的重要性質

  1. 一個二叉樹第 ii 層的最大結點數爲:2i12^{i-1}i1i \geq 1
  2. 深度爲 kk 的二叉樹有最大結點總數爲:2k12^{k}-1k1k \geq 1

  對任何非空二叉樹 TT,若n0n_{0}表示葉節點的個數、n2n_{2}是度爲2的非葉節點個數,那麼兩者滿足關係n0=n2+1n_{0}=n_{2}+1

例圖

  如上圖所示,n0=4n_{0}=4n1=2n_{1}=2n2=3n_{2}=3,滿足n0=n2+1n_{0}=n_{2}+1

抽象數據類型

  類型名稱:二叉樹

  數據對象集:一個有窮的結點集合。若不爲空,則由根結點和其左、右二叉子樹組成。

  操作集

  BT \in BinTree, Item \in ElementType,重要操作有:

  1. Boolean IsEmpty( BinTree BT):判別BT是否爲空;
  2. void Traversal( BinTree BT):遍歷,按某順序訪問每個結點;
  3. BinTree CreatBinTree():創建-一個二叉樹。

  常用的遍歷方法有:

  • void PreOrderTraversal( BinTree BT)先序—根、左子樹、右子樹;
  • void InOrderTraversal( BinTree BT )中序–左子樹、根、右子樹;
  • void PostOrderTraversal( BinTree BT)後序—左子樹、 右子樹、根;
  • void LevelOrderTraversal( BinTree BT)層次遍歷,從上到下、從左到右;

二叉樹的存儲結構

  1. 順序存儲結構

  對於完全二叉樹,一般按照按從上至下、從左到右順序存儲 nn 個結點的完全二叉樹的結點父子關係

  可以採用數組的形式對其進行存儲:

數組存儲

圖形化表示

  • 對於非根結點(序號 i>1i > 1)的父結點的序號是 i/2i/2
  • 結點(序號爲 ii )的左孩子結點的序號是 2i2i, (若2in2i \leq n,否則沒有左孩子);
  • 結點(序號爲 ii )的右孩子結點的序號是 2i+12i+1, (若2i+1n2 i +1 \leq n,否則沒有右孩子);

  對於一般的二叉樹也可以採用這種結構,但是會造成空間浪費,如下圖所示的補全方法:

一般二叉樹

  1. 鏈表存儲

  用鏈表存儲的話可採用如下結構體:

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
	ElementType Data;
	BinTree Left;
	BinTree Right;
}

鏈表表現形式

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