我制作了一个通用二进制堆(MaxHeap),我必须根据节点中的值搜索特定节点。我已经使得搜索功能使用Pre-OrderTraversal并且它应该给出Order n的运行时间,其中n是Heap中的节点数。我的代码似乎不起作用。它永远不会进入preOrderT函数中的第二个'else if'。你能否建议可以对其进行哪些更改?
我的节点类已被定义为包含一个整数键(根据其排列堆),一个通用对象值,以及对父,leftChild和rightChild的引用。
public Node<E> search(E p){
Node<E> N;
N= preOrderT(root, p);
return N;
}
public Node<E> preOrderT(Node<E> N, E p){
Node<E> M=null;
if (N.value==p) M=N;
else if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);}
else if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);}
return M;
}
答案 0 :(得分:2)
问题是如果有leftChild
,那么您永远不会给它机会检查rightChild
。相反,在您完成对leftChild
的检查后,请检查rightChild
是否尚未找到该值。
答案 1 :(得分:0)
您需要将您的功能更新为:
public Node<E> preOrderT(Node<E> N, E p){
Node<E> M=null;
if (N.value==p) M=N;
else
{
if (N.leftChild!=null){ M=preOrderT(N.leftChild, p);}
if (N.rightChild!=null){ M=preOrderT(N.rightChild, p);}
}
return M;
}
答案 2 :(得分:0)
如下更改。
if (N.value==p) M=N;
else {
if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);}
if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);}
}