节点即使被指定为null也不会从BST中删除

时间:2015-10-22 18:25:28

标签: actionscript-3 binary-search-tree pass-by-reference

我在as3中构建了一个BST,它包含一个从树中删除具有提供值的节点的函数。

这是代码。这里拉实际上意味着“删除”。我只提供有问题的代码。

public function pull(k:int)
{
    //find the node in BST
    t = search(k);
    //if the node was found with value k
    if (t) 
    {
        //the node did not have any children
        if (t.none())
        {
            //simply set it to null
            t = null;
        }
        else if (t.one())
        {

        }
        else if (t.two())
        {

        }
    }
}

我已经在树12和10中插入了两个值。 树是这样的

  12
 /
10

然后我调用了函数

 pull(10);

但是当我尝试追踪(bst.root.leftChild)时,它仍然将输出作为

 [Object Node]

我不知道如何解决它。

2 个答案:

答案 0 :(得分:0)

我对AS3不熟悉,但我会尝试回答这个问题。 基本上当你执行t = search(k)时你正在做的是搜索函数返回t中引用的副本,换句话说,t被设置为引用{{1}的结果}}

当您执行search(k)时,除了删除t = null与要删除的树节点之间的连接之外,您什么都不做。但这并没有删除节点。它只是设置t以引用t

来自C背景,我将建议两种解决方法:

  1. 使用类似指针的指针(如果它存在于AS3中,抱歉我不知道)。
  2. 使用所需节点的父节点将其删除。例如,如果要删除null的左子节点b,则执行a将删除所需节点,因为它实际上充当指针的指针。
  3. 我为我的答案中的任何实际错误道歉,如果我错了,请纠正我。

答案 1 :(得分:0)

将对象设置为null并不是一种快速删除它的有效方法,实际上它很可能会保留一段时间,直到它最终成为GC。但是,当然只有在该对象的每个单个引用都无效时才会发生这种情况。如果该对象在其他地方仍然被引用,那么将一个变量无效将无效。

因此,即使在取消所有引用时,对象也会保持存在一段时间,因此最好的方法是实现一个将对象设置为非活动状态的方法,可以跳过它。之后,您可以开始删除对它的所有引用。

您正在跟踪的简单事实" trace(bst.root.leftChild)"意味着变量" leftChild"仍然有一个对节点对象的引用,如果你没有使那个对象无效,那么该对象仍然存在。如果您没有取消对该对象的所有引用,那么该对象将保持存在。