二叉樹及存儲結構

1、二叉樹的定義

二叉樹T:一個有窮的結點集合。spa

  • 這個集合能夠爲空
  • 若不爲空,則它是由根節點和稱爲其左子樹\(T_L\)右子樹\(T_R\)的兩個不相交的二叉樹組成。

二叉樹具體五種基本形態code

二叉樹的子樹有左右順序之分對象

2、特殊二叉樹

2.1 斜二叉樹(Skewed Binary Tree)

斜二叉樹以下圖所示:blog

2.2 完美二叉樹(Perfect Binary Tree)

完美二叉樹也稱做滿二叉樹(Full Binary Tree)it

完美二叉樹以下圖所示:io

2.3 徹底二叉樹(Complete Binary Tree)

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

徹底二叉樹以下圖所示:二叉樹

以下圖所示的二叉樹即不爲徹底二叉樹:rsa

3、二叉樹的幾個重要性質

  • 一個二叉樹第i層的最大結點樹爲:\(2^{i-1}, \quad{i}\geq1\)
  • 深度爲k的二叉樹有最大結點總數爲:\(2^k -1, \quad k\geq{1}\)

  • 對任何非空二叉樹T,若\(n_0\)表示葉節點的個數、\(n_2\)是度爲2的非葉結點個數,那麼二者知足關係\(n_0=n_2+1\)

4、二叉樹的抽象數據類型定義

類型名稱:二叉樹

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

操做集:\(BT\in{BinTree},\quad Item \in ElementType\),其重要操做有:

  1. BooleanIsEmpty(BinTree BT):判斷BT是否爲空;
  2. void Traversal(BinTree BT):遍歷,按某順序訪問每一個結點;
  3. BinTree CreateBinTree():建立一個二叉樹。

4.1 經常使用的遍歷方法

接下來介紹幾個經常使用的遍歷方法,將來會詳細講解

void PreOrderTraversal(BinTree BT):先序 --》根、左子樹、右子樹;

void InOrderTraversal(BinTree BT):中序 --》左子樹、根、右子樹;

void PostOrderTraversal(BinTree BT):後序 --》左子樹、右子樹、根;

void LevelOrderTraversal(BinTree BT):層次遍歷,從上到下、從左到右

5、二叉樹的存儲結構

5.1 順序存儲結構

徹底二叉樹:按從上至下、從左到右順序存儲,n個結點的徹底二叉樹的結點父子關係

  • 非根節點(序號i>1)的父結點的序號是\([i/2]\)
  • 結點(序號爲i)的左孩子結點的序號是2i(若\(2i\leq{n}\),不然沒有左孩子);
  • 結點(序號爲i)的右孩子結點的序號是2i+1(若\(2i+1\leq{n}\),不然沒有右孩子)

通常二叉樹也能夠採用這種結構,但會形成空間浪費……

5.2 鏈表存儲

/* c語言實現 */

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
  ElementType Data;
  BinTree Left;
  BinTree Right;
}
# python語言實現

class TreeNode:
     def __init__(self, x):
         self.val = x
         self.left = None
         self.right = None

單個子節點用下圖所示鏈表表示:

使用鏈表對整棵樹的表示以下:

相關文章
相關標籤/搜索