一
二叉樹定義:
滿足以下三個條件
1,根節點
2,去跟,分成兩個不相交的集合TL和TR
3,TL和TR也爲二叉樹(遞歸定義)
二
基本形態:
由三個節點構成的二叉樹的個數
三
性質:
1,第i層有2^(i-1)個節點
2,深度爲k的二叉樹,做多爲 2^(k)-1個節點
k層二叉樹有2^(k)-1個節點,叫蠻二叉樹
3,度爲0的節點的個數爲n0
度爲1的節點的個數爲n1
度爲2的節點的個數爲n2
則n0=n2+1
推導過程:
設節點總數爲n,分支數爲b
則:
n=n0+n1+n2
b=n1+2n2
b=n-1
4,假如一棵包含 n 個結點的二叉樹中每個結點都可以和滿二叉樹中編號爲1至 n 的結點一、一對應,則稱這類二叉樹爲完全二叉樹。
n個節點的完全二叉樹,深度爲[log2 n]+1
5,完全二叉樹中,編號爲i的節點,左孩子編號爲2i,有孩子爲2i+1,雙親編號爲floor(i/2)
四
存儲結構
1,順序 先補成完全二叉樹
const MAXSIZE = 100; // 暫定二叉樹中結點數的最大值爲100
typedef struct {
ElemType *data; // 存儲空間基址(初始化時分配空間)
int nodeNum; // 二叉樹中結點數
} SqBiTree; // 二叉樹的順序存儲結構
2,鏈式
二叉鏈表:
左孩子域和右孩子域
typedef struct BiTNode {
ElemType data;
struct BiTNode *Lchild, *Rchild; // 左、右孩子指針
} *BiTree;
三叉鏈表:
typedef struct TriTNode {
ElemType data;
struct BiTNode *Lchild, *Rchild; // 左、右孩子指針
struct BiTNode *parent; // 雙親指針
} *TriTree;
雙親鏈表
const MAXSIZE = 100; // 暫定二叉樹中結點數的最大值爲100
typedef struct BPTNode { // 結點結構
ElemType data;
int *parent; // 指向雙親的指針
char LRTag; // 左、右孩子標誌域
} BPTNode
typedef struct BPTree{ // 樹結構
BPTNode *nodes; // 初始化時分配存儲空間
int nodeNum; // 結點數目
int root; // 根結點的位置
} BPTree
cin>>BT.nodeNum; // 輸入結點數目
BT.root=0;
cin>> BT.nodes[0].data; // 輸入根
BT.nodes[0].parent = -1; // 根的雙親爲空
BT.nodes[0].LRTag = 'L';
for (i=1; i<BT.nodeNum; i++)
{
cin>> BT.nodes[i].data >> F >>BT.nodes[i].LRtag;
k=i-1;
while (k>=0 && BT.nodes[k].data != F) k--; // 查詢雙親
if (k<0) return FALSE; // 沒有找到雙親
BT.nodes[i].parent = k;
return TRUE;
}
}