考研数据结构(每日一题)
题目:写出在中序线索二叉树里查找指定结点在后序的前驱结点的算法。
算法思想:
在后序序列中:
若结点p有右子女,则右子女是前驱
若无右子女而有左子女,则左子女是前驱
若结点p左右都无子女,设其中序左线索指向某祖先结点f(p是f右子树种按中序遍历的第一个结点)
若f有左子女,则其左子女是结点p在后序下的前驱
若f无左子女,则顺其前驱找双亲的双亲,一直找到双亲有左子女(这时左子女是p的前驱)
若p是中序遍历的第一个结点,则结点p在中序和后序下都无前驱
完整代码:
BiThrTree InPostPre(BiThrTree t,BiThrTree p){
BiThrTree q;
if (p -> rtag == 0) //若p有右子女,则右子女是其后序前驱
{
q = p -> rchild;
}else if(p -> ltag == 0) //若p只有左子女,则左子女是其后序前驱
{
q = p -> lchild;
}else if(p -> lchild == NULL){
q = NULL; //p是中序序列的第一个结点,无后序前驱
}else{ //顺着左线索向上找p的祖先,若存在,再找祖先的左子女
while (p -> ltag == 1 && p -> lchild != NULL)
{
p = p -> lchild;
}
if(p -> ltag == 0){
q = p -> lchild; //p结点的祖先的左子女是其后序前驱
}else{
q = NULL; //仅有单支树(p是叶子),已到根结点,p无后序前驱
}
}
return q;
}