题目:给定一个二叉搜索树上的结点,输出其后继结点(按中序遍历)。
解答:假定给定二叉搜索树的结点为x,主要分两种情况:
1.x的右孩子不为空,则x的后继是x的右子树上最小的,也就是右子树上寻找最后一个左孩子。如图所示:
2.x的右孩子为空,则x的后继应该是x的祖先结点或者为空,
具体程序如下:
struct TreeNode
{
char key;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
};
TreeNode *FindSuccessor(TreeNode *x)
{
if(x->right!=NULL)
{
TreeNode *q=x->right;
while(q->left)
q=q->left;
return q;
}
TreeNode *p=x->parent;
while(p&&x==p->right)
{
x=p;
p=p->parent;
}
return p;
}