在BST的继承人

时间:2011-10-23 08:53:01

标签: c algorithm data-structures

给定一个函数getInorderSuccessor,它将BST(二进制搜索树)作为它的参数。每个节点都有一个额外的指针“next”,它初始化为null,接下来用表示Inorder Successor的节点指针填充。我的以下代码没有给出正确的输出

node * getInorderSuccessor(node * root){
struct node * current = root;
static int flag = 0;

if (root != NULL)
{
if (flag != 2)
{ 
    current->next = getInorderSuccessor(current->left);
}
    if(current ==root)
        flag = 1;
    if (flag == 1)
    {
        flag = 2;
        current->next = root;
        }
    if (flag!=2)
    {

        current->next = getInorderSuccessor(current->right);

    }

}

2 个答案:

答案 0 :(得分:0)

假设“左”为高而“右”为低:

如果有left分支,则下一个更高的节点将在其中。因此,后继将是left分支中最低(最右边)的节点。

如果没有left分支,我们需要上升树(朝向根),直到当前节点离开下一个节点,即直到当前节点(当我们上升时)树)是其父级的right分支。那个父母将成为继任者。

在任何情况下,您都需要某种方式来了解每个节点的父节点,至少在当前节点的路径上...因为您可能需要移动到树的根节点。这可能是每个节点中的parent指针,或者是当前节点路径上的某种节点列表。

至于你的代码,我不确定你的工作方式,但是:

current->next = getInorderSuccessor(current->left);

......看起来很奇怪。如果current->left是高分支,那么current->left的后继将至少是current的两个节点 - 所以它不能是current的直接后继者。如果left是低分支,它根本不能包含current的后继者,所以它仍然没有意义。

我也没有在任何地方看到return声明。

答案 1 :(得分:0)

该函数的所有(递归)调用都使用相同的静态变量。如果你想记住你离开的路径,你需要更多(或其他)变量。