線索二叉樹的運算
(
在中序線索二叉樹中
① 若*p的右子樹空(即p
【例】下圖的中序線索二叉樹中
② 若*p的右子樹非空(即p
【例】上圖的中序線索二叉樹中
A的中序後繼是F
F的中序後繼是H
B的中序後繼是D
在中序線索二叉樹中求中序後繼結點的過程可【參見動畫演示】
BinThrNode *InorderSuccessor(BinThrNode *p)
{//在中序線索樹中找結點*p的中序後繼
BinThrNode *q
if (p
Return p
else{
q=p
while (q
q=q
return q
} //end if
}
該算法的時間復雜度不超過樹的高度h
(
中序是一種對稱序
① 若*p的左子樹為空
【例】上圖所示的中序線索二叉樹中
② 若*p的左子樹非空
【例】上圖所示中序線索二叉樹中
在中序線索二叉樹中求中序前趨結點的過程可【參見動畫演示】
BinThrNode *Inorderpre(BinThrNode *p)
{//在中序線索樹中找結點*p的中序前趨
BinThrNode *q
if (p
return p
else{
q=p
while (q
q=q
return q
} //end if
}
由上述討論可知
(
在後序線索二叉樹中
① 若*p的左子樹為空
【例】在下圖所示的後序線索二叉樹中
② 若*p的左子樹非空
當*p的右子樹非空時
【例】在上圖所示的後序線索二叉樹中
當*p無右子樹時
【例】在上圖所示的後序線索二叉樹中
(
具體的規律
① 若*p是根
② 若*p是其雙親的右孩子
【例】上圖所示的後序線索二叉樹中
③ 若*p是其雙親的左孩子
【例】上圖所示的後序線索二叉樹中
④ 若*p是其雙親的左孩子
【例】上圖所示的後序線索二叉樹中
注意
F是孩子樹中
由上述討論中可知
(
【參見練習】
(
【參見參考書】
在前序線索二叉樹中
遍歷某種次序的線索二叉樹
遍歷中序線索二叉樹算法
void TraverseInorderThrTree(BinThrTree p)
{ //遍歷中序線索二叉樹
if(p){//樹非空
while(p
p=p
do{
printf(
p=InorderSuccessor(p)
}while(p)
}//endif
}//TraverselnorderThrTree
分析
① 中序序列的終端結點的右線索為空
② 該算法的時間復雜性為O(n)
③ 以上介紹的線索二叉樹是一種全線索樹(即左右線索均要建立)
④ 若在線索鏈表中增加一個頭結點
From:http://tw.wingwit.com/Article/program/sjjg/201311/22667.html