在线索二叉树中找前驱/后继
一、中序线索二叉树
1.中序线索二叉树找中序后继
//找到以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; //rtag==1直接返回后继线索
}
}
//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)
void inOrder(ThreadNode *T){
for(ThreadNode *p=firstNode(T); p!=null; p=nextNode(p)){
visit(p);
}
}//空间复杂度O(1)
2.中序线索二叉树找中序前驱
//找到以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; //ltag==1直接返回前驱线索
}
}
//对中序线索二叉树进行逆向中序遍历
void revInOrder(ThreadNode *T){
for(ThreadNode *p=lastNode(T); p!=null; p=preNode(p)){
visit(p);
}
}
二、先序线索二叉树
1.先序线索二叉树找先序后继
2.线索线索二叉树找先序前驱
三、后序线索二叉树
1.后序线索二叉树找后序后继
2.后序线索二叉树找后序前驱
中序线索二叉树 | 先序线索二叉树 | 后序线索二叉树 | |
---|---|---|---|
找前驱 | 是 | 否 | 是 |
找后继 | 是 | 是 | 否 |
除非用三叉链表,或者用土办法从根开始遍历寻找