Java 如果不使用父引用节点,如何在二叉树中找到光标的父节点
我正在尝试将光标移动到二叉树中的父节点。我希望递归地执行此操作,而不使用保留节点来跟踪父节点。我认为我的基本/停止案例是正确的,但我相信最后两个if陈述是错误的。我不知道该怎么办。任何建议都会有帮助。多谢各位Java 如果不使用父引用节点,如何在二叉树中找到光标的父节点,java,binary-tree,Java,Binary Tree,我正在尝试将光标移动到二叉树中的父节点。我希望递归地执行此操作,而不使用保留节点来跟踪父节点。我认为我的基本/停止案例是正确的,但我相信最后两个if陈述是错误的。我不知道该怎么办。任何建议都会有帮助。多谢各位 public void cursorToParent() { TreeNode parent = root; if(cursor == root ) return; if(parent.getLeft().equals(cursor) || p
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()
,因为我们想知道它们是否包含相同的值,但这里=
就足够了,因为它的内部结构中每个节点只存在一次。