目录
一、中序线索二叉树找中序后继
在中序线索二叉树中找到指定结点*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没有后序后继