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. 操作
  • 3. 應用
  1. 2 - Tree & Binary Tree

2.6 - Thread Binary Tree

介紹引線二元樹及操作。

Previous2.5 - HeapNext2.7 - Tree and Binary Tree Conversion

Last updated 6 years ago

1. 介紹

n個節點的二元樹若以Link List表示則會有n+1個指標指向NULL,為了充分利用這些指標,將他們改指向其他節點,則稱為引線二元樹。其中這些指標稱為Thread Pointers。

  • 左引線:若 x->lchild = NULL則改指向中序排序中的前一個節點。

  • 右引線:若 x->rchild = NULL則改指向中序排序中的後一個節點。

節點儲存結構:

[Left Thread] [Lchild] [Data] [Rchild] [Right Thread]

  • Left Thread: True表示Lchild是左引線;False表示Lchild指向左子點

  • Right Thread: True表示Rchild是右引線;False表示Rchild指向左子點

另外增加一個Head不存Data。

圖示:

2. 操作

2.1 找出中序排序中x的下一個節點

node *Insuc(node *x){
    node *temp = x->rchild;
    if (x->RightThread == False){ //若x->RightThread為True, temp即找到
        while(temp->LeftThread == False)
            temp = temp->lchild;
    }
    return temp;
}

2.2 在引線二元樹中插入一個節點(insert a right child)

void InsertRightChild(node *s, node *t){  //s為樹中節點, t為新節點
    t->RightThread = s->RightThread;      //設置t的右子點、右引線
    t->rchild = s->rchild;
    t->LeftThread = True;                 //設置t的左子點、左引線
    t-lchild = s;
    s->RightThread = False;               //將s連到t
    s->rchild = t;
    if (s->RightThread == False){         //若s無右子點
        node *temp = Insuc(s);            //中序排序中s的下一個節點
        temp->lchild = t;
    }
}

2.3 在引線二元樹中插入一個節點(insert a left child)

void InsertLeftChild(node *s, node *t){  //s為樹中節點, t為新節點
    t->LeftThread = s->LeftThread;       //設置t的左子點、左引線
    t->lchild = s->lchild;
    t->RightThread = True;               //設置t的右子點、右引線
    t-rchild = s;
    s->LeftThread = False;               //將s連到t
    s->lchild = t;
    if (s->LeftThread == False){         //若s無左子點
        node *temp = Pre(s);             //中序排序中s的上一個節點
        temp->rchild = t;
    }
}

node *Pre(node *x){
    node *temp = x->lchild;
    if (x->LeftThread == False){ //若x->RightThread為True, temp即找到
        while(temp->RightThread == False)
            temp = temp->rchild;
    }
    return temp;
}

3. 應用

簡化中序追蹤的演算法

void Inorder(node *head){
    node *hd = head;
    node *temp;
    while(temp == hd){
        temp = Insuc(head);
        head = temp;
    }
}