1. 程式人生 > 實用技巧 >資料結構筆記 — 樹

資料結構筆記 — 樹


1 普通樹

1.1 樹的概念
  • (Tree) 是n(n>=0)個結點的有限集,當 n=0 時成為空樹,在任意一棵非空樹中

    • 有且僅有一個 特定的稱為根 (Root) 的結點

    • n>1 時,其餘結點可分為 m(m>0) 個互不相交的有限集 1、T2、..、Tm,其中每一個集合本身又是一棵樹,並且稱為根的子樹 (SubTree)

  • 每一個圈稱為樹的一個 結點 ,結點擁有的子樹數稱為 結點的度 (Degree) ,樹的度取樹內各結點的度的 最大值

    • 度為 0 的結點稱為葉結點 (Leaf) 或終端結點

    • 度不為 0 的結點稱為分支結點點或非終端結點,除根結點外,分支結點也稱為內部結點

  • 節點間關係

    • 結點的子樹的根稱為結點的孩子 (Child),相應的,該結點稱為孩子的雙親 (Parent) ,同一雙親的孩子之間互稱為兄弟 (Sibling)

    • 結點的祖先是從根到該結點所經分支上的所有結點

  • 結點的層次

    • 結點的層次 (Level) 從根開始,根為第一層,根的孩子為第二層

    • 其雙親在同一層的結點互為堂兄弟

    • 樹中結點的最大層次稱為樹的深度 (Depth) 或高度

  • 如果將樹中結點的各子樹看成從左至右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹

  • 森林 (Forest)m(m>=0) 棵互不相交的樹的集合。對樹中每個結點而言,其子樹的集合即為森林

1.2 樹的結構及表示

雙親表示法

#define MAX_TREE_SIZE 100
typedef int ElemType ;
​
typedef struct PTNode{
   ElemType data;  //結點資料
   int parent;     //雙親位置
} PTNode;
​
typedef struct {
   PTNode nodes[MAX_TREE_SIZE];
   int r;      //根的位置
   int n;      //結點數目
} PTree;

  • 此種表示法中,我們可以根據某節點的 parent 指標找到其雙親結點,時間複雜度為 O(1)

    ,當做一年到 parent == 1 時,表示找到了樹的根節點

  • 但是,如果想要知道某結點的孩子,那麼只能遍歷整個樹,此時,應當改變一下表示方法

孩子表示法

  • 每個結點的指標指向一個連結串列,連結串列中存放的是其孩子結點所對應的的下標值

孩子雙親表示法

  • 將上方的孩子表示法進行完善,加入每個結點的雙親所對應的下標即可

    #include <stdio.h>
    #define MAX_TREE_SIZE 100
    typedef char ElemType;
    ​
    //孩子結點
    typedef struct CTNode{
       int child;              //孩子結點的下標
       struct CTNode *next;    //指向下一孩子結點的指標
    } *ChildPtr;
    ​
    //表頭結構
    typedef struct {
       ElemType data;          //存放樹中結點的資料
       int parent;             //存放雙親的下標
       ChildPtr firstChild;    //指向第一個孩子的指標
    } CTBox;
    ​
    //樹結構
    typedef struct {
       CTBox nodes[MAX_TREE_SIZE]; //結點陣列
       int root, num;              //根節點和節點數量
    } CTree;

2 二叉樹

  • 二又樹 (Bnary Tree)n(n>=0) 個結點的有限集合,該集合或者為空集 (空二又樹) ,或者由一個根結點和兩棵互不相交的、分別稱為根結點點的左子樹和右子樹的二又樹組成

  • 二叉樹特點

    • 每個結點最多有兩棵子樹,所以二又樹中不存在度大於 2 的結點

    • 左子樹和右子樹是有順序的,次序不能顛倒

    • 即使樹中某結點只有一棵子樹,也要 區分它是左子樹還是右子樹

  • 斜樹:均為左子樹或者均為右子樹

  • 滿二叉樹 :在一棵二又樹中,如果所有分支結點 都存在左子樹和右子樹 ,並且 所有葉子都在同一層 上,這樣的二又樹稱為滿二又樹

    • 特點

      • 葉子只能出現在最下一層

      • 非葉子結點的度一定是 2

      • 在同樣深度的二又樹中,滿二又樹的結點個數一定最多,同時葉子也是最多

  • 完全二叉樹 :對一棵具有 n 個結點的二又樹按層序編號,如果編號為 i(1<=i<=n) 的結點與同樣深度的滿二又樹中編號為 i 的結點點位置完全相同,則這棵二叉樹稱為完全二又樹

    • 特點

      • 葉子結點只能出現在最下兩層

      • 最下層的葉子一定集中在左部連續位置

      • 倒數第二層,若有葉子結點,一定都在右部連續位置

      • 如果結點度為 1 ,則該結點只有左孩子

      • 同樣結點樹的二又樹,完全二又樹的深度最小

      • 滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹

  • 二叉樹的性質

    • 二叉樹的第 i 層至多有 個結點 (i >= 1)

    • 深度為 k 的二叉樹至多有 個結點 (k >= 1)

    • 對於任意一棵二叉樹 T ,如果其終端結點數為 ,度為 2 的結點數為 ,則 ​n0 = n1 + 1

    • 如果對一棵擁有 n 個結點的完全二叉樹(深度為)的結點按照層序編號,對於任意結點 i(1 <= i <= n) 具有以下性質:

      • 如果 i = 1 ,則結點 i 是二叉樹的根,無雙親

      • 如果 i > 1 ,則其雙親是結點 ​[ i / 2] (下限取整)

      • 如果 2i > n ,則結點 i 無左孩子(結點 i 為葉子結點 ),否則其左孩子是結點 2i

      • 如果 2i+1 > n ,則結點 i 無右孩子,否則其右孩子是結點 2i+1

>>>>> CONTINUE <<<<<