[樹] 0 樹總結 - 記憶版
阿新 • • 發佈:2018-11-26
文章目錄
儲存結構
樹
雙親表示法
typedef struct PTNode {
Elem data;
int parent; // 雙親位置域
} PTNode;
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int r, n; //根結點的位置和結點個數
} PTree;
孩子連結串列
//孩子
typedef struct CTNode {
int child;
struct CTNode *next;
} *ChildPtr;
//雙親
typedef struct {
Elem data;
ChildPtr firstchild; // 孩子鏈的頭指標
} CTBox;
//樹
typedef struct {
CTBox nodes[ MAX_TREE_SIZE];
int n, r; // 結點數和根結點的位置
} CTree;
孩子兄弟表示法
typedef struct CSNode{
Elem data;
struct CSNode
*firstchild, *nextsibling;
} CSNode, *CSTree;
二叉樹
順序儲存
#define MAX_TREE_SIZE 100
// 二叉樹的最大結點數
typedef TElemType SqBiTree[MAX_
TREE_SIZE] ;
// 0號單元儲存根結點
SqBiTree bt;
二叉連結串列
typedef struct BiTNode { // 結點結構
TElemType data;
struct BiTNode *lchild, *rchild; // 左右孩子指標
} BiTNode, *BiTree;
三叉連結串列
typedef struct TriTNode { // 結點結構
TElemType data;
struct TriTNode *lchild, *rchild; //左右孩子指標
struct TriTNode *parent; //雙親指標
} TriTNode, *TriTree;
雙親連結串列
typedef struct BPTNode { // 結點結構
TElemType data;
int *parent; // 指向雙親的指標
char LRTag; // 左、右孩子標誌域
} BPTNode
typedef struct BPTree{ // 樹結構
BPTNode nodes[MAX_TREE_SIZE];
int num_node; // 結點數目
int root; // 根結點的位置
} BPTree
線索連結串列
typedef enum { Link, Thread } PointerThr; // Link==0:指標,Thread==1:線索
typedef struct BiThrNod {
TElemType data;
struct BiThrNode *lchild, *rchild; // 左右指標
PointerThr LTag, RTag; // 左右標誌
} BiThrNode, *BiThrTree;
基礎內容
二叉樹
- 二叉樹有左右之分
- 完全二叉樹:層次遍歷的序列中,是沒有NULL結點的
- 滿二叉樹
- 判斷是否為完全二叉樹,並獲得總結點數n
- 結點的總數n和高度h關係: --> 判斷n+1是不是2的次方
【二叉樹性質】
- n個結點,能構造成h(n)中不同的二叉樹:
-
-->推廣:
(m為樹的度)
【例如】樹中空指標的個數是多少?
【技巧】把所有的空指標看作葉子結點,則原來的所有結點都成了n2 --> 空指標n0=樹中所有結點個數+1 - n個結點的完全二叉樹高度:h = ⌊log2n⌋+1 = ⌈log2(n+1)⌉
- 第i層上最多有節點2i-1(i≥1)個結點
- 滿二叉樹中前k層的結點個數為2k-1
- 編號為1~n的完全二叉樹
- i的爸爸=⌊i/2⌋
- i的左孩子=2i
- i的右孩子=2i+1