目錄
一、中序線索二叉樹找中序後繼
在中序線索二叉樹中找到指定結點*p的中序後繼next
①若p->rtag == 1,則next = p->rchild
②若p->rtag == 0
//找到以P爲跟的子樹中,第一個被中序遍歷的結點
ThreadNode *Firstnode(ThreadNode *p){
//循環找到最左下結點(不一定是葉子結點)
while(p->ltag == 0)
p = p->lchild;
return p;
}
//在中序線索二叉樹中找到結點p的後繼結點
ThreadNode *Nextnode(ThreadNode *p){
//右子樹中最左下結點
if(p->rtag == 0)
return Firstnode(p->rchild);
else
return p->rchild;
}
//對中序線索二叉樹進行中序遍歷(利用線索實現的非遞歸算法) 空間複雜度O(1)
void Inorder(ThreadNode *T){
for(ThreadNode *p = Firstnode(T);p != NULL; p = Nextnode(p))
visit(p);
}
二、中序線索二叉樹中找中序前驅
在中序線索二叉樹中找到指定結點*p的中序前驅pre
①若p->ltag == 1,則pre = p->lchild
②若p->ltag == 0
//找到以P爲跟的子樹中,最後一個被中序遍歷的結點
ThreadNode *Lastnode(ThreadNode *p){
//循環找到最右下結點(不一定是葉子結點)
while(p->rtag == 0)
p = p->rchild;
return p;
}
//在中序線索二叉樹中找到結點p的前驅結點
ThreadNode *Prenode(ThreadNode *p){
//左子樹中最右下結點
if(p->ltag == 0)
return Lastnode(p->lchild);
else
return p->lchild;
}
//對中序線索二叉樹進行中序遍歷(利用線索實現的非遞歸算法) 空間複雜度O(1)
void RevInorder(ThreadNode *T){
for(ThreadNode *p = Lastnode(T);p != NULL; p = Prenode(p))
visit(p);
}
三、先序線索二叉樹找先序後繼
在先序線索二叉樹中找到指定結點*p的先序後繼next
①若p->rtag == 1,則next = p->rchild
②若p->rtag == 0
四、先序線索二叉樹找先序前驅
在先序線索二叉樹中找到指定結點*p的先序前驅pre
①若p->ltag == 1,則next = p->lchild
② 若p->ltag = 0
前提:改用三叉鏈表可以找到父節點
①如果能找到p的父節點,且p是左孩子
②如果能找到p的父節點,且p是右孩子,其左兄弟爲空
③如果能找到p的父節點,且p是右孩子,其左兄弟非空
④如果p是根結點,則p沒有先序前驅
五、後序線索二叉樹找後序前驅
在後序線索二叉樹中找到指定結點*p的後序前驅pre
①若p->ltag == 1,則pre = p->lchild
②若p->ltag == 0
六、後序線索二叉樹找後序後繼
在後序線索二叉樹中找到指定結點*p的後序後繼next
①若p->rtag == 1,則next = p->rchild
②若p->rtag == 0
前提:改用三叉鏈表可以找到父節點
①如果能找到p的父節點,且p是右孩子
②如果能找到p的父節點,且p是左孩子,且右兄弟爲空
③如果能找到p的父節點,且p是左孩子,且右兄弟非空
④如果p是根節點,則p沒有後序後繼