2017-03-04 6 views
0

노드에있는 값을 기반으로 특정 노드를 검색해야하는 일반 이진 힙 (MaxHeap)을 만들었습니다. Pre-OrderTraversal을 사용하는 검색 기능을 제공하고 Order n의 런타임을 제공해야합니다. 여기서 n은 힙의 노드 수입니다. 내 코드가 작동하지 않는 것 같습니다. preOrderT 함수에 두 번째 'else if'가 없습니다. 어떤 변화가있을 수 있는지 제안 해 주시겠습니까?힙 검색 기능

내 노드 클래스는 (힙 배열에 따라) 정수 키, 일반 개체 값 및 부모, leftChild 및 rightChild에 대한 참조를 포함하도록 정의되었습니다. 당신이 그것에게 rightChild을 확인할 수있는 기회를 제공, 절대 leftChild가있는 경우

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

'println'은 당신의 친구입니다 -'에 println ("N.value :"+ N.value + "P :"+ P), 나는 아직도 이유를 이해하지 – rbellamy

답변

2

문제입니다. 대신 leftChild 확인을 완료했으면 값을 아직 찾지 못한 경우 rightChild을 확인하십시오. 아래

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; 

}

+0

에 무슨 일이 일어나고 있는지 볼' 두 번째 'else if'에 들어 가지 않습니다. 첫 번째 else if 루프에 M에 대해 null 값이 주어지면 프로그램이 두 번째 else에 들어 가지 않아야합니까? – Avi

+0

첫 번째'else if'가 성공하면 두 번째'else if'는 첫 번째 본문에서 무슨 일이 일어나 든 관계없이 실행되지 않습니다. – Jeremy

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);} 
} 
+0

고마워요. 나는이 문제에 2 시간 동안 붙어 있었고 무엇이 잘못되었는지 알 수 없었다. 제안 된 편집을 한 후에 코드가 작동합니다. – Avi

+0

나는 왜 그것이 두 번째 'else if'에 들어 가지 않는지 아직도 이해하지 못한다. 첫 번째 else if 루프에 M에 대해 null 값이 주어지면 프로그램이 두 번째 else에 들어 가지 않아야합니까? – Avi

+0

'if'가 실행되지 않는 경우에만 'else if'가 실행됩니다. 귀하의 경우이 시나리오가 있습니다 : 'if'및 'else if'그리고 다시 'else if'이므로이 세 가지 경우 중 하나만 실행될 수 있습니다. 귀하의 경우, 마지막 else if는 처음 두 조건이 충족되지 않는 경우에만 실행됩니다. 즉, "N.value가 p와 같지 않고"N.leftChild가 null과 같을 때만 세 번째 'else if'조건을 확인합니다. –

0

변화 :

+0

고마워요. 나는이 문제에 2 시간 동안 붙어 있었고 무엇이 잘못되었는지 알 수 없었다. 제안 된 편집을 한 후에 코드가 작동합니다. – Avi

+0

나는 왜 그것이 두 번째 'else if'에 들어 가지 않는지 아직도 이해하지 못한다. 첫 번째 else if 루프에 M에 대해 null 값이 주어지면 프로그램이 두 번째 else에 들어 가지 않아야합니까? – Avi