# 2.6 - Thread Binary Tree

### &#x20;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。

圖示：&#x20;

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHhBRDWIlvRlzuJb7Xf%2F-LHhBW6TOTeNcnrtZ2HQ%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-18%2019.41.02.jpg?alt=media\&token=47ae0a4b-7c5b-403e-87bc-7af58d05a0aa)

### 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;
    }
}
```
