【问题标题】:Node Reference in Binary Tree二叉树中的节点引用
【发布时间】:2014-01-02 09:11:33
【问题描述】:

所以我想进入我的树(假定没有重复项并且分支正确)并找到参数中给出的元素。我发现我的方法在其字段中为我提供了一个类似于我想要的(根)的 BinaryNode,但实际上不是根。我没有重写 equals 方法。使用 equals 方法,当返回的对象与根进行比较时,测试返回 false。我想知道为什么我的变量 elementNode 在设置为空时不引用(并因此更改)根为空。

二进制节点是用泛型实现的。以根为起点调用此方法。任何帮助将不胜感激,谢谢。

/**
 * Returns the node that the sought element resides within
 * 
 * @param element: The element being hunted
 * @param start: The start of the search (usually the root)
 * @return The node that the element resides in
 */
private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) {


    if (start.getElement().equals(element)) {
        return start;
    }

    // the element is not in the collection
    if (start.getLeftChild() == null && start.getRightChild() == null) {
        return null;
    }

    int comparison = element.compareTo(start.getElement());

    if (comparison < 0) {
        return findElementNode(element, start.getLeftChild());
    } else {
        return findElementNode(element, start.getRightChild());
    }
}

示例编辑:(这是一种删除方法)

    if (!hasLeft && !hasRight) {

        System.out.println(elementNode + "," + root);
        elementNode = null;         
        System.out.println(elementNode + "," + root);

        return true;
    }

这个输出:

BinaryNode@68b0019f,BinaryNode@68b0019f and null,BinaryNode@68b0019f

编辑答案:返回的元素没有将其指向的节点设置为 null 的原因是因为在 Java 中,我们只能指向而不是编辑内存位置。因此,为了使我的节点为空,我将找到父节点并将其左/右子节点设置为空。

【问题讨论】:

  • "我知道这一点是因为根字段(树的成员)是我正在搜索的内容,并且它不等于找到的项目,即使所有字段都保持相同值。” 你能给我们举个小例子来说明这个问题吗?您是否覆盖了您的树所拥有的对象类中的 equals 方法?
  • 我忘了补充一点,我一直在寻找有关这些的信息,但我的问题似乎太具体了。我认为错误很小,我只是忽略了一些明显的东西
  • 目前这对于任何非完美平衡的树都将失败 - 您需要检查 start 是否为空,或者只为存在的孩子递归调用 findElementNode。除此之外,它看起来还不错 - 一个简短但完整的示例会很有用。在错误的描述中甚至不清楚您的意思......
  • John & ZouZou:我添加了那个检查和我的测试示例并澄清了我的解释

标签: java recursion binary-tree pass-by-reference


【解决方案1】:

试试这样的东西。

private boolean findElementNode(T element, BinaryNode<T> start) {

    if (start == null) {
       return false;
    } else {
      if (element.getElement().equals(start.getElement())) {
         return true;
      } else {
         int comparison = element.compareTo(start.getElement());

         if (comparison < 0) {
            return findElementNode(element, start.getLeftChild());
         } else {
            return findElementNode(element, start.getRightChild());
         }          
     }
}

编辑:这实际上是你想要的。告诉我这是否有效。

private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) {
    if(start != null){
        if(start.getElement().equals(element)){
           return start;
        } else {
            BinaryNode<T> start = findElementNode(element, start.getLeftChild());
            if(start == null) {
                start = findElementNode(element, start.getRightChild());
            }
            return start;
         }
    } else {
        return null;
    }
}

【讨论】:

  • 对不起,我有点困惑。我想实际获取包含我正在搜索的元素的节点。使用这种方法,我不会得到 true(找到元素)或 false(元素不在树中)吗?
  • 是的,我的错。我添加了一个新的解决方案
  • 您的错误解决了它不“等于”根的问题。但是,当我将 elementNode(从您的代码返回)设置为 null 时,根保持不变,而 node 变量变为 null。我不确定如何解决这个问题。既然它们是相等的并且引用内存中的相同空间,那么设置一个等于 null 不应该意味着另一个也变为 null 吗?
  • 我的意思是你的新解决方案,而不是你的错误。在回读时发现了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2014-04-04
  • 2023-04-07
  • 2021-07-12
  • 2013-07-06
  • 1970-01-01
相关资源
最近更新 更多