定義
二叉樹:一個有窮的結點集合。這個集合可以爲空,若不爲空,則它是由根結點和稱爲其左子樹和右子樹的兩個不相交的二叉樹組成。
有五種基本的形式:
- 空樹。
- 只有一個節點。
- 有一個節點,只有左子樹,右子樹爲空。
- 有一個節點,左子樹爲空,右子樹不爲空。
- 左右子樹都不爲空。
具體如下圖所示:
這裏需要注意的是:二叉樹與度爲2
的樹的區別在於二叉樹有左右之分。
特殊二叉樹
有三種特殊的二叉樹,斜二叉樹、完美二叉樹、完全二叉樹:
- 斜二叉樹(
Skewed Binary Tree
)
- 完美二叉樹(
Perfect Binary Tree
)
完美二叉樹(Perfect Binary Tree
)也稱作滿二叉樹(Full Binary Tree
)
- 完全二叉樹(
Complete Binary Tree
)
有個結點的二叉樹,對樹中結點按從上至下、從左到右順序進行編號,編號爲結點與滿二叉樹中編號爲 結點在二叉樹中位置相同。
二叉樹的重要性質
- 一個二叉樹第 層的最大結點數爲:,。
- 深度爲 的二叉樹有最大結點總數爲:,。
對任何非空二叉樹 ,若表示葉節點的個數、是度爲2
的非葉節點個數,那麼兩者滿足關係。
如上圖所示,,,,滿足。
抽象數據類型
類型名稱:二叉樹
數據對象集:一個有窮的結點集合。若不爲空,則由根結點和其左、右二叉子樹組成。
操作集:
BT
BinTree
, Item
ElementType
,重要操作有:
Boolean IsEmpty( BinTree BT)
:判別BT是否爲空;void Traversal( BinTree BT)
:遍歷,按某順序訪問每個結點;BinTree CreatBinTree()
:創建-一個二叉樹。
常用的遍歷方法有:
void PreOrderTraversal( BinTree BT)
:先序—根、左子樹、右子樹;void InOrderTraversal( BinTree BT )
:中序–左子樹、根、右子樹;void PostOrderTraversal( BinTree BT)
:後序—左子樹、 右子樹、根;void LevelOrderTraversal( BinTree BT)
:層次遍歷,從上到下、從左到右;
二叉樹的存儲結構
- 順序存儲結構
對於完全二叉樹,一般按照按從上至下、從左到右順序存儲 個結點的完全二叉樹的結點父子關係;
可以採用數組的形式對其進行存儲:
- 對於非根結點(序號 )的父結點的序號是 ;
- 結點(序號爲 )的左孩子結點的序號是 , (若,否則沒有左孩子);
- 結點(序號爲 )的右孩子結點的序號是 , (若,否則沒有右孩子);
對於一般的二叉樹也可以採用這種結構,但是會造成空間浪費,如下圖所示的補全方法:
- 鏈表存儲
用鏈表存儲的話可採用如下結構體:
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}