我在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]
我不知道如何解决它。
答案 0 :(得分:0)
我对AS3不熟悉,但我会尝试回答这个问题。
基本上当你执行t = search(k)
时你正在做的是搜索函数返回t
中引用的副本,换句话说,t
被设置为引用{{1}的结果}}
当您执行search(k)
时,除了删除t = null
与要删除的树节点之间的连接之外,您什么都不做。但这并没有删除节点。它只是设置t
以引用t
。
来自C背景,我将建议两种解决方法:
null
的左子节点b
,则执行a
将删除所需节点,因为它实际上充当指针的指针。我为我的答案中的任何实际错误道歉,如果我错了,请纠正我。
答案 1 :(得分:0)
将对象设置为null并不是一种快速删除它的有效方法,实际上它很可能会保留一段时间,直到它最终成为GC。但是,当然只有在该对象的每个单个引用都无效时才会发生这种情况。如果该对象在其他地方仍然被引用,那么将一个变量无效将无效。
因此,即使在取消所有引用时,对象也会保持存在一段时间,因此最好的方法是实现一个将对象设置为非活动状态的方法,可以跳过它。之后,您可以开始删除对它的所有引用。
您正在跟踪的简单事实" trace(bst.root.leftChild)"意味着变量" leftChild"仍然有一个对节点对象的引用,如果你没有使那个对象无效,那么该对象仍然存在。如果您没有取消对该对象的所有引用,那么该对象将保持存在。