2.6 - Thread Binary Tree
介紹引線二元樹及操作。
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;
}
}
Last updated