我正在研究一个代码,用于确定2 BST在值方面是否相等。
这是我提出的,但它只会返回true,我真的不知道问题是什么。
public boolean same(BSTree t2) {
return sameTree(root, t2);
}
private boolean sameTree(TreeNode n, BSTree other) {//L-M-R
boolean found = false;
if (n != null) {
sameTree(n.getLeftNode(), other);
if (other.search(n.getData())) {
found = true;
}
sameTree(n.getRightNode(), other);
}
return found;
}
在main方法中,我创建了2个BST并在其中插入了值。然后我打电话给我以后调用方法:
System.out.println("Are the trees the same: " + tree1.same(tree2));
答案 0 :(得分:1)
你的逻辑是关闭的。这就是它现在正在做的事情:你经历每个节点。如果它在另一个BST中找到,则代码集被发现为true但是如果其中一个孩子不在其他树中呢?你递归地调用这个孩子的函数,结果证明是假的但是没有那个返回的值。最后,您只检查第一个呼叫(根)是否在第二个BST中。
要解决此问题,请在每次调用后进行检查,以查看返回的值是否为false。如果是,则一起退出递归并返回false。
答案 1 :(得分:1)
此代码存在两个问题:
sameTree
tree1
中是否包含tree2
。即使tree2
中的节点多于tree1
中的节点,它也会返回true。答案 2 :(得分:0)
我尝试了一种不同的方法,在这里(工作得非常好!)
public boolean same(BST t1,BST t2){
return sameHelper(t1.root,t2.root)
}
private boolean sameHelper(TreeNode n1,TreeNode n2){
if(n1==n2){
return true;
}else if(n1==null||n2==null){
return false;
}else{
return ((n1.data==n2.data) && (n1.llink==n2.llink) && (n1.rlink==n2.rlink));
}
就像你们说的那样,在我之前的方法中,我只检查根,当根相同时它返回true。