1. 程式人生 > >[樹] 0 樹總結 - 記憶版

[樹] 0 樹總結 - 記憶版

文章目錄

儲存結構

雙親表示法

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;

基礎內容

二叉樹

  1. 二叉樹有左右之分
  2. 完全二叉樹:層次遍歷的序列中,是沒有NULL結點的
  3. 滿二叉樹
    • 判斷是否為完全二叉樹,並獲得總結點數n
    • 結點的總數n和高度h關係: n = 2 h 1 1 n=2^{h-1}-1 --> 判斷n+1是不是2的次方

【二叉樹性質】

  1. n個結點,能構造成h(n)中不同的二叉樹: h ( n ) = C 2 n n n + 1 h(n)=\frac{C^{n}_{2n}}{n+1}
  2. n 0 = n 2 + 1 n_0 = n_2 + 1 -->推廣: n 0 = 1 + n 2 + 2 n 3 + . . . + ( m 1 ) n m n_0=1+n_2+2n_3+...+(m-1)n_m (m為樹的度)
    【例如】樹中空指標的個數是多少?
    【技巧】把所有的空指標看作葉子結點,則原來的所有結點都成了n2 --> 空指標n0=樹中所有結點個數+1
  3. n個結點的完全二叉樹高度:h = ⌊log2n⌋+1 = ⌈log2(n+1)⌉
  4. 第i層上最多有節點2i-1(i≥1)個結點
  5. 滿二叉樹中前k層的結點個數為2k-1
  6. 編號為1~n的完全二叉樹
    • i的爸爸=⌊i/2⌋
    • i的左孩子=2i
    • i的右孩子=2i+1