Data Structure
  • 資料結構自學筆記
  • 1 - Stack & Queue
    • 1.1 - Stack
    • 1.2 - Queue
    • 1.3 - Stack and Queue
  • 2 - Tree & Binary Tree
    • 2.1 - Tree
    • 2.2 - Binary Tree
    • 2.3 - Binary Tree Traversal
    • 2.4 - Binary Search Tree
    • 2.5 - Heap
    • 2.6 - Thread Binary Tree
    • 2.7 - Tree and Binary Tree Conversion
    • 2.8 Advanced Trees
      • 2.8.1 - Min-Max Heap
      • 2.8.2 - Deap
      • 2.8.3 - Symmetric Min-Max Heap
      • 2.8.4 - Extended Binary Tree
      • 2.8.5 - AVL Tree
      • 2.8.6 - M-Way Search Tree
      • 2.8.7 - B Tree
      • 2.8.8 - Red-Black Tree
      • 2.8.9 - Optimal Binary Search Tree
      • 2.8.10 - Splay Tree
      • 2.8.11 - Leftest Heap
      • 2.8.12 - Binomial Heap
  • 3 - Search & Sort
    • 3.1 - Searching
    • 3.2 - Elementary Sorting
      • 3.2.1 - Insertion Sort
      • 3.2.2 - Selection Sort
      • 3.2.3 - Bubble Sort
      • 3.2.4 - Shell Sort
    • 3.3 - Sophisticated Sorting
      • 3.3.1 - Quick Sort
      • 3.3.2 - Merge Sort
      • 3.3.3 - Heap Sort
      • 3.3.4 - Radix Sort
      • 3.3.5 - Bucket Sort
      • 3.3.6 - Counting Sort
    • 3.4 - Summary
  • 4 - Graph
    • 4.1 - Intro
    • 4.2 - Graph Traversal
    • 4.3 - Spanning Tree
      • 4.3.1 - Kruskal's algorithm
      • 4.3.2 - Prim's algorithm
      • 4.3.3 - Sollin's algorithm
    • 4.4 - Shortest Path Length
      • 4.4.1 - Dijkstra's algorithm
      • 4.4.2 - Bellman-Ford algorithm
      • 4.4.3 - Floyd-Warshall algorithm
    • 4.5 - AOV Network
    • 4.6 - AOE Network
    • 4.7 - Others
Powered by GitBook
On this page
  • 1. 介紹
  • 2. 應用
  1. 2 - Tree & Binary Tree

2.3 - Binary Tree Traversal

介紹Binary Tree追蹤法則

1. 介紹

         Root
       /      \
Left Child   Right Child
  • Left child必須在Right child之前拜訪

  1. Pre-order(前序):root → left child → right child

  2. In-order(中序):left child → root → right child

  3. Post-order(後序):left child → right child → root

  4. level-order:依照level由上而下,由左而右

2. 應用

2.1 求Binary Tree的前中後序

       A
     /   \
    B     C
   / \   / \
  D  E  F   G
  1. pre-order: A-B-D-E-C-F-G

  2. in-order: D-B-E-A-F-C-G

  3. post-order: D-E-B-F-G-C-A

  4. level-order: A-B-C-D-E-F-G

2.2 給予Binary Tree的(前序、中序)或是(後序、中序)可決定唯一的Binary Tree

(complete/full binary tree的前、中、後序皆可決定唯一binary tree)

證明:

  1. 當節點數=0時,binary tree為空。pre-order=in-order=0,此binary tree為空。

  2. 假設節點數=n-1時此定理成立。

  3. 當節點數=n時,從pre-order中找出root為R,再到in-order中找到R的位置。

令R左方為 TLT_{L}TL​ ,節點數 nLn_{L}nL​ ;右方為 TRT_{R}TR​ 節點數 nRn_{R}nR​

再到pre-order中的第二個點取出 nLn_{L}nL​ 個節點,為 TL∗T_{L}^{*}TL∗​ ;接續取出 nRn_{R}nR​ 個節點,為 TR∗T_{R}^{*}TR∗​

TL∗T_{L}^{*}TL∗​和 TR∗T_{R}^{*}TR∗​ 為左右子樹的pre-order,且nLn_{L}nL​ 、 nRn_{R}nR​ ≤n−1≤n-1≤n−1 滿足第二點假設。根據數學歸納法,此定理成立。

2.3 Recursive Traversal Algorithm

void preorder(bt_tree *bt){
    if (bt != NULL){
        printf("%d", bt->Data);
        preorder(bt->lchild);
        preorder(bt->rchild);
    }
}
void inorder(bt_tree *bt){
    if (bt != NULL){
        preorder(bt->lchild);
        printf("%d", bt->Data);
        preorder(bt->rchild);
    }
}

2.4 Recursive Traversal Algorithm的應用

  1. copy():複製binary tree。

  2. equal():比較binary tree。

  3. count():求binary tree節點總數。

  4. height():求binary tree高度。

  5. swap():將binary tree的children對調。

bt_tree *copy(bt_tree *bt_ori){
    static bt_tree *bt_new;
    if (bt_ori == NULL){
        bt_new = NULL;
    }
    else{
        bt_new->Data = bt_ori->Data;
        bt_new->lchild = copy(bt_ori->lchild);
        bt_new->rchild = copy(bt_ori->rchild);
    }
    return bt_new;
}
bool equal(bt_tree *bt1, bt_tree *bt2){
    if (bt1 == NULL && bt2 == NULL) return True;
    else{
        if (bt1->Data == bt2->Data)
            if (equal(bt1->lchild, bt2->lchild))
                return equal(bt1->rchild, bt2->rchild);
        return False;        
    }
}
int count(bt_tree *bt){
    int nl, nr;
    if (bt == NULL)    return 0;
    else{
        nl = count(bt->lchild);
        nr = count(bt->rchild);
        return nl+nr+1;
    }
}       
int height(bt_tree *bt){
    int hl, hr;
    if (bt == NULL)    return 0;
    else{
        hl = count(bt->lchild);
        hr = count(bt->rchild);
        return max(hl, hr)+1;
    }
}       
void swap(bt_tree *bt){
    bt_tree *temp;
    if (bt != NULL){
        swap(bt->lchild);
        swap(bt->rchild);
        temp = bt->lchild;
        bt->lchild = bt->rchild;
        bt->rchild = temp;
    }
}

2.5 以binary tree表示運算式

  1. leaf -> 運算元

  2. non-leaf -> 運算子

  3. 運算子優先權越高,level越大

a+b*c-d

      -
    /   \
   +     d
  / \
 a   *
    /  \
   b    c
int eval(bt_tree* bt){
    if (bt != NULL){
        eval(bt->lchild);
        eval(bt->rchild);
        switch(bt->Data){
            case '+': return (bt->lchild)->Data+(bt->rchild)->Data;
            case '-': return (bt->lchild)->Data-(bt->rchild)->Data;
            case '*': return (bt->lchild)->Data*(bt->rchild)->Data;
            case '/': return (bt->lchild)->Data/(bt->rchild)->Data;
            default: return bt->Data;
        }
    }
}
Previous2.2 - Binary TreeNext2.4 - Binary Search Tree

Last updated 6 years ago