二叉树中的节点参考

时间:2014-01-02 09:11:33

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

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

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

/**
 * 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和null,BinaryNode @ 68b0019f

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

1 个答案:

答案 0 :(得分:0)

尝试这样的事情。

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;
    }
}