Java 如果不使用父引用节点,如何在二叉树中找到光标的父节点

Java 如果不使用父引用节点,如何在二叉树中找到光标的父节点,java,binary-tree,Java,Binary Tree,我正在尝试将光标移动到二叉树中的父节点。我希望递归地执行此操作,而不使用保留节点来跟踪父节点。我认为我的基本/停止案例是正确的,但我相信最后两个if陈述是错误的。我不知道该怎么办。任何建议都会有帮助。多谢各位 public void cursorToParent() { TreeNode parent = root; if(cursor == root ) return; if(parent.getLeft().equals(cursor) || p

我正在尝试将光标移动到二叉树中的父节点。我希望递归地执行此操作,而不使用保留节点来跟踪父节点。我认为我的基本/停止案例是正确的,但我相信最后两个if陈述是错误的。我不知道该怎么办。任何建议都会有帮助。多谢各位

   public void cursorToParent()
{
    TreeNode parent = root;
    if(cursor == root )
        return;
    if(parent.getLeft().equals(cursor) || parent.getRight().equals(cursor) )
        cursor = parent;
    else
        if(parent.getLeft()!=null)
        {
            parent = parent.getLeft();
            cursorToParent();
        }
        if(parent.getLeft()!=null)
        {
            parent = parent.getLeft();
            cursorToParent();
        }

}

需要将
当前
处理节点传递给方法。因此必须有一个方法
cursorToParentImpl()
,它将使用前一个方法中的
root
调用:

public boolean cursorToParentImpl(TreeNode current)
{
    if(cursor == current )
        return false;
    if(current.getLeft () == cursor || current.getRight() == cursor) {
        cursor = current;
        return true;
    }
    else { // note the missing parenthesis too
        if(current.getLeft()!=null) {
            if (cursorToParentImpl(current.getLeft()))
                return true;
        }
        if(current.getRight()!=null) {
            if (cursorToParentImpl(current.getRight()))
                return true;
        }
    }
    return false;
}
并称之为:

public void cursorToParent()
{
    if (cursor == root)
        return;
    cursorToParentImpl(root);
}

另外,您可以避免调用
equals()
,只需使用
=
操作符,因为这里它应该比较对节点的引用。

需要将
当前处理节点传递给该方法。因此必须有一个方法
cursorToParentImpl()
,它将使用前一个方法中的
root
调用:

public boolean cursorToParentImpl(TreeNode current)
{
    if(cursor == current )
        return false;
    if(current.getLeft () == cursor || current.getRight() == cursor) {
        cursor = current;
        return true;
    }
    else { // note the missing parenthesis too
        if(current.getLeft()!=null) {
            if (cursorToParentImpl(current.getLeft()))
                return true;
        }
        if(current.getRight()!=null) {
            if (cursorToParentImpl(current.getRight()))
                return true;
        }
    }
    return false;
}
并称之为:

public void cursorToParent()
{
    if (cursor == root)
        return;
    cursorToParentImpl(root);
}

另外,您可以避免调用
equals()
,只需使用
=
操作符,因为这里它应该比较对节点的引用。

您需要将参数传递给
cursorToParent
方法。为了获得更好的帮助,请张贴一个预期输出的示例。谢谢我正在制作一棵树,其中光标根据是或否的答案移动(树的左侧或右侧)。例如,如果根为红色,则是(右节点)=苹果,否(左节点)=橙色。所以如果我的光标现在在橙色。当我调用我的方法时,我希望光标指向orange的父对象,即红色@在中,需要将参数传递给
cursorToParent
方法。为了获得更好的帮助,请张贴一个预期输出的示例。谢谢我正在制作一棵树,其中光标根据是或否的答案移动(树的左侧或右侧)。例如,如果根为红色,则是(右节点)=苹果,否(左节点)=橙色。所以如果我的光标现在在橙色。当我调用我的方法时,我希望光标指向orange的父对象,即红色@在我尝试了你所做的,它只是返回光标位置。第二个递归调用分支右有一个不正确的保护,它应该检查
current.getRight()=空
。它当前调用了
getLeft()
@jackiechan:这可能是因为equals。我把它改成
==
。谢谢robbmj,修正了。是的,非常感谢!它是.equals()的原因。==和等于之间的区别是什么?当我想如果我比较对象,我必须使用equals()@兹比涅克夫斯科夫斯基-kvr000@jackiechen:
equals()
比较内容(如果两个对象具有相同的值),而
=
比较对象是否是完全相同的实例。通常我们使用
equals(),它应该检查
current.getRight()=空
。它当前调用了
getLeft()
@jackiechan:这可能是因为equals。我把它改成
==
。谢谢robbmj,修正了。是的,非常感谢!它是.equals()的原因。==和等于之间的区别是什么?当我想如果我比较对象,我必须使用equals()@兹比涅克夫斯科夫斯基-kvr000@jackiechen:
equals()
比较内容(如果两个对象具有相同的值),而
=
比较对象是否是完全相同的实例。通常我们使用
equals()
,因为我们想知道它们是否包含相同的值,但这里
=
就足够了,因为它的内部结构中每个节点只存在一次。