没有父信息的BST继承人

时间:2013-02-28 13:21:44

标签: algorithm data-structures tree

我试图找到BST节点的顺序继承者。以下是我的示例代码。

public TreeNode getInorderSuccesor(TreeNode t)
{

    if(t == null)
    {
        return null;
    }

    if(t.getRight()!=null)
    {
        t = t.getRight();
        while(t.getLeft()!=null)
        {
            t = t.getLeft();
        }
        return t;
    }
    else
    {
        TreeNode parent = t.getParent();

        while(parent!=null && parent.getLeft() != t)
        {
            t = parent;
            parent = t.getParent();
        }
        return parent;
    }
}

如果有任何条件失败,请告诉我。还有一件事,如果有人可以共享algo / code / sudocode来找到没有父节点的inorder后继者。感谢!!!

2 个答案:

答案 0 :(得分:0)

这是后继功能的基本逻辑;前一功能类似,但相反。递归函数下降树搜索所请求的密钥,每次跟随左子树时,跟踪当前树作为可能的后继者。如果找到密钥,则其后继元素是右子树的最小元素,通过追踪左子树直到到达空节点为止。如果搜索到达空节点并因此无法找到密钥,则树中的下一个最大密钥是后继,在每个递归调用中保存的可能后继中找到。我最近在my blog实现了这个算法。

答案 1 :(得分:0)

如果树中的节点具有唯一值,那么它非常简单。你只需要找到:

  • 编号最大的节点小于或等于需要确定其后继节点的节点的值
  • 具有最小编号的节点,该节点严格大于需要确定其后继节点的节点的值。

后一个节点将是答案。第一个节点可用于检查输入节点是否是树中的有效节点。

的伪代码:

function inOrderSuccessor(val, tree):
    (left, right) = findRange(val, tree.rootnode, null, null)

    if (left.val != val):
        throw Error("No node with specified value")

    return right


function findRange(val, currnode, left, right):
    if (currnode == null):
        return (left, right)

    if (currnode.val <= val):
        return findRange(val, currNode.right, currnode, right)
    else:
        return findRange(val, currNode.right, left, currnode)

如果树中的节点可能具有重复值,则有序后继节点定义不明确。有必要知道何时给定节点,如何区分具有相同值的不同节点。您是否真的参考了树中的节点?

在一个棘手的情况下,你只是给一个节点的引用,并且树中有其他节点具有相同的值,那么有两种情况:

  • 案例1:节点有正确的子树,那么你只需要找到右子树中的最小元素。
  • 案例2:节点没有正确的子树。您需要检查具有相同值的所有节点的引用相等性。当你在树中找到节点时,从节点向上遍历到root(你在栈中有这个),找到第一个左转的节点。