2012-10-07 1 views
1

바이너리 트리에 이름으로 정렬 된 요소 generic 유형을 삽입하기위한 코드를 작성했습니다. 그래도 그것이 정확하다고 생각하지 마십시오.java 바이너리 트리 삽입 함수 비 재귀

public boolean insert(E e) { 
    BTNode temp = root; 
    if (root == null) { 
     root.setElement(e); 
    } 
    while (temp != null) 
    if (temp.element().getClass().getName().compareTo(e.getClass().getName()) < 0) { 
     temp = temp.getRight(); 
    } else { 
     temp = temp.getLeft(); 
    } 
    temp.setElement(e); 
    return true; 
} 

수정 사항을 제안 할 수 있습니까? 아마데우스는 언급 한 바와 같이

+1

그리고 무엇이 문제인가? – Augusto

+4

while 문 다음에 세미콜론을 제거하십시오. –

+0

'temp' - 변수 이름의 탁월한 선택. –

답변

2

인서트는 새로운 노드를 작성해야합니다. 나는 constructor를 보지 못했기 때문에 그들을 어떻게 만들지는 않겠지 만 다음 줄을 따라 뭔가를 제안한다.

public boolean insert(E e) {   
    if (root == null) { 
     root = new BTNode(); 
     root.setElement(e); //how would this work with a null root? 
     return true; //that's it, we're done (when is this ever false by the way?) 
    } 
    BTNode current = root; 
    while (true) { //brackets! indenting is important for readabilty 
     BTNode parent=current; 
     if (current.element().getClass().getName().compareTo(e.getClass().getName()) < 0) { 
      current = current.getRight(); 
      if(current==null) { //we don't have a right node, need to make one 
       current = new BTNode(); 
       parent.setRight(current); 
       break; //we have a new node in "current" that is empty 
      } 
     } else { 
      current= current.getLeft(); 
      if(current==null) { //we don't have a left node, need to make one 
       current = new BTNode(); 
       parent.setLeft(current); 
       break; //we have a new node in "current" that is empty 
      } 
     } 
    } 
    current.setElement(e); 
    return true; 
} 
-1

는, while 루프는 마지막에 세미콜론을하지 말았어야 :

BTNode temp = root; 
    if (root == null) { 
     root.setElement(e); 
     return; 
    } 
    while (temp != null) 
    { 
     if (temp.element().getClass().getName().compareTo(e.getClass().getName()) < 0) { 
      if(temp.getRight() != null) 
      temp = temp.getRight(); 
      else 
      { 
       temp.createRight(e); 
       temp = null; //or break 
      } 
     } else { 
      if(temp.getLeft() != null) 
      temp = temp.getLeft(); 
      else 
      { 
       temp.createLeft(e); 
       temp = null; //or break 
      } 
     } 
    } 

    return true; 
+0

-1 그리고 언급 한대로 : 다음 줄 temp.setElement (e); 항상 널 포인터 예외입니다. – weston

+0

또 다른 해결책은 'catch'블록에서 예외를 잡아 노드 생성을 처리하는 것입니다 ... 추한 일이지만 ... –

+0

여전히 'temp = null;'이 잘못되어 NPE가 어떻게 중지됩니까? – weston