假设以带双亲指针的二叉链表作为二叉树的存储结构,其结点结构的类型说明如下:
typedef char DataType;
typedef struct node{
DataType data;
struct node *lchild, *rchild;
struct node *parent;
}BiTNode;
若ROOT为根节点,px为指向非空二叉树中某个结点的指针,可借助该结构求得px所指结点在二叉树中的中序序列的后继。
(1)就后继的不同情况,简要叙述求后继操作的方法。
(2)编写算法求px所指结点的中序序列后继,写注释。
BiTNode *findNext(BiTNode *px)
{
if(px == NULL)
{
return NULL;
}
BiTNode *q, *p;
if(px->rchild != NULL)//右子树不为空,在右子树上找最左结点
{
q = px->rchild;
while(q->lchild != NULL)
{
q = q->lchild;
}
return q;//最左孩子即为后继结点
}
else//右子树为空
{
//1. 若当前结点是其父结点的左孩子,则父结点为后继
//2. 若当前结点不是其父结点的左孩子时,一直往上找,直到当前结点是其父结点的左孩子,则父结点为后继
p = px->parent;
//当前结点是整个树的最右结点时,parent最后会为null,无后继结点
while(p != NULL && p->lchild != px)
{
px = parent;
p = p->parent;
}
return p;
}
}