如何找到一个结点的后继?
思路
- 如果这个结点已经被线索化,只需要找到他的rchild
- 如果这个结点未被线索化,需要找到右孩子的最左边的孩子
实现代码:
BiTNode *Firstnode(BiTNode *p){
while(p->ltag==0){
p = p->lchild;
}
return p;
}//找到最左下的结点
BiTNode *Nextnote(BiTNode *p){
if(p->rtag == 0)
return Firstnode(p->rchlid)
else
return p->rchlid;
}
void Inorder(BiTree *t){
for(BiTNode *p = Firstnode(t);p!=NULL;p = Nextnote(p))
visit(p);
}
如何找到一个结点的前驱?
思路:
- 如果一个结点已经被线索化,直接找到它的左孩子
- 如果未被线索化,找到它左孩子的最右边的结点
实现代码
BiTNode *Firstnode(BiTNode *p){
while(p->rtag!=0){
p = p->rchild;
}
}
BiTNode *Nextnote(BiTNode *p){
if(p->ltag == 0)
return Firstnode(p->lchlid)
else
return p->lchlid;
}
void Inorder(BiTree *t){
for(BiTNode *p = Firstnode(t);p!=NULL;p = Nextnote(p))
visit(p);
}
先序线索二叉树找先序后继
如果是先序线索二叉树找前驱,无法找到,只能从头到尾找
如果 是三叉链表
- 如果结点是根节点:没有前驱
- 如果结点是父节点的左孩子,前驱是父节点
- 如果结点是父节点的右孩子,前驱是兄弟节点最后访问的结点
后续线索二叉树找前驱后继
- 如果找前驱,如果有右孩子,一定是右孩子,如果有左孩子,一定是左孩子
- 找后续后继,因为后继不存在自己的左右子树当中,所以无法找到