【问题标题】:Inorder successor of BST without parent info没有父信息的 BST 的有序继任者
【发布时间】:2013-02-28 13:21:44
【问题描述】:

我试图在 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;
    }
}

如果有任何条件会失败,请告诉我。如果有些人可以共享算法/代码/ sudocode 以找到没有父节点的顺序后继者,还有一件事。谢谢!!!

【问题讨论】:

  • 您可以简单地搜索树中比当前节点大的最小节点。如果你有相同值的节点,事情会稍微复杂一些。

标签: algorithm data-structures tree


【解决方案1】:

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

【讨论】:

  • 你甚至不需要追逐。您只需要在遍历树以找到比当前元素大的元素时跟踪最小的较大元素。
【解决方案2】:

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

  • 小于等于需要确定后继节点值的最大节点数
  • 编号最小的节点严格大于需要确定后继节点的值。

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

伪代码:

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:节点没有右子树。您需要检查所有具有相同值的节点的引用相等性。在树中找到节点后,从节点向上遍历返回根(堆栈中有此节点),然后找到第一个左转节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多