2017-11-02 5 views
1

그래서 BST에 노드를 삽입하거나 추가하려고 시도해 본 적이 있습니다. 나는 계속 받고있다. 스레드 "main"의 예외 java.lang.StackOverflowError 내가 재귀에 의한 것으로 가정하고 있지만, 여기서 어디로 가야하는지 정확히 알지 못한다. 누군가가 도움을 줄 수 있다면 어떤 방향으로 향할 것이다. 그것. :)Java에서 comparable을 사용하여 반복적으로 BST에 노드 추가

public void add(Type obj) { 

    TreeNode<Type> newNode = new TreeNode<Type>(obj); 

    if (root == null) { 
     root = newNode; 
    } else { 
     addNode(root, newNode); 
    } 
} 


private void addNode(TreeNode<Type> current, TreeNode<Type> newNode) { 

    current = root; 
    if (current == null) { 
     current = newNode; 
    } else if (newNode.getValue().compareTo(current.getValue()) < 0) { 

     if (current.getLeft() == null) { 
      current.setLeft(newNode); 

     } else { 
      addNode(current.getLeft(), newNode); 
     } 
    } else if (newNode.getValue().compareTo(current.getValue()) > 0) { 

     if (current.getRight() == null) { 
      current.setRight(newNode); 
     } else { 
      addNode(current.getRight(), newNode); 
     } 
    } 
}//end add  

답변

0
private void addNode(TreeNode<Type> current, TreeNode<Type> newNode) { 

current = root; 
if (current == null) { 
    current = newNode; 
} else if (newNode.getValue().compareTo(current.getValue()) < 0) { 

    if (current.getLeft() == null) { 
     current.setLeft(newNode); 

    } else { 
     addNode(current.getLeft(), newNode); 
    } 

당신은 현재의 포인트를 root와 동일하게 설정했는지보십시오. StackOverFlow가 발생하므로 루트를 가리 키지 않아야합니다. 당신은 다음과 같이 변경할 수 있습니다 :

current = root

if(root == null){ 
    root = newNode; 
    return; 
} 
+0

고마워요! 어리석은 실수 였지만 도움을 주셔서 감사합니다! – KylePhill975

0

먼저 current = root;을 지정하고 다음 다음 줄에 당신이 확인하고 있습니다 :

if (current == null) 

이 조건이 항상 false를 반환합니다 (root을 가정하는 것은 null하지 않습니다).

"else if"내부에서 수행하는 작업은 훌륭하지만 처음에는 if 부분을 제거해야합니다.

둘째, 당신은 더 나은, rootnull 인 경우를 처리 루트가 null로, 그렇지 않은 경우 만 먼저 확인 별도의 방법으로 그것을 할 필요가 - 루트이 방법 (addNode 명) 및 삽입 된 노드를 호출

+0

감사 :이 줄을 제거 할 필요가! 더미처럼 느껴지지만, 적어도 지금은 작동 중입니다! – KylePhill975

관련 문제