搜索功能堆

时间:2017-03-04 18:52:14

标签: java search heap

我制作了一个通用二进制堆(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;
}

3 个答案:

答案 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);}
}