我正在填充二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点都包含String数据;并且假设我只使用“*”为每个叶子初始化String数据。 在那个方法中,我遍历树,直到找到给定的节点(叶子),所以我可以返回父节点。 找到一个叶子后,我想检查节点(叶子)是否与我正在搜索的目标相同。 遗憾的是,情况并非如此,并且该方法返回父级第一个找到的叶子。 我使用了.equals()方法和“==”运算符,但它们都不起作用。 有谁知道如何解决这个问题?
BinaryNode root = new BinaryNode("root",2);
BinaryNode na = new BinaryNode("a",2);
BinaryNode naLeaf1= new BinaryNode("*",0);
BinaryNode naLeaf2 = new BinaryNode("*",0);
na.addChild(naLeaf1);
na.addChild(naLeaf2);
BinaryNode nb = new BinaryNode("b",2);
BinaryNode nbLeaf1= new BinaryNode("*",0);
BinaryNode nbLeaf2 = new BinaryNode("*",0);
nb.addChild(nbLeaf1);
nb.addChild(nbLeaf2);
root.addChild(na);
root.addChild(nb);
这是遍历二叉树的递归方法。
public BinaryNode getParent(BinaryNode root, BinaryNode target) {
if(root!=null) {
for(BinaryNode ni: root.childeren) {
if(!ni.data.equals("*")) {
return getParent(ni, target);
}else {
if(ni.equals(target)) {
return root;
}
}
}
}
return root;
}
我为.equals方法添加了一个覆盖,但这似乎无法解决问题。
@Override
public boolean equals(Object target) {
if(target==null) return false;
if(target==this) return true;
if(!(target instanceof BinaryNode)) return false;
return false;
}
答案 0 :(得分:2)
你的问题不是'equals'方法,而是你使用的算法。首先,BinaryNode不是父项作为字段吗?如果没有,那么请认真考虑添加。
如果你真的不希望每个节点都知道它的父节点,那么你需要遍历整个树,而不只是遍历一个分支。如下所示:
public BinaryNode getParentOf(BinaryNode target) {
for(BinaryNode child: children) {
if (child == target) {
return this;
}
BinaryNode result = child.getParentOf(target);
if (result != null ) {
return result;
}
}
return null;
}
但严重的是,确保每个节点都知道它的父节点。
答案 1 :(得分:1)
在你的.equals()覆盖中,你需要对两个这样的对象的确切分离进行一些计算。如何检查您提供的参数,如果root
和target
相同,则对象是相同的。
答案 2 :(得分:0)
查看第一个if
条件!ni.data.equals("*")
。评估结果为false
,对吗?因为您为所有叶子设置数据为'*'。
此ni.equals(target)
也会评估为false
,因为您的equals
方法没有任何问题,并且按预期工作。
这种情况发生在所有孩子身上,你离开了循环,然后返回root
。
你需要重新思考这个功能的逻辑,这是错误的。 equals
虽然没有任何问题(你不需要像这样覆盖它,只能使用==
)。