2010-04-24 6 views
0

내 바이너리 트리의 inOrder 순회를 인쇄하는 데 문제가 있습니다. 트리에 많은 항목을 삽입 한 후에도 3 개의 항목 만 인쇄합니다.Java 바이너리 트리. InOrder traversal 인쇄

public class BinaryTree { 

    private TreeNode root; 
    private int size; 

    public BinaryTree(){ 
     this.size = 0; 
    } 

    public boolean insert(TreeNode node){ 

     if(root == null) 
      root = node; 

     else{ 
      TreeNode parent = null; 
      TreeNode current = root; 
      while(current != null){ 
       if(node.getData().getValue().compareTo(current.getData().getValue()) <0){ 
        parent = current; 
        current = current.getLeft(); 
       } 
       else if(node.getData().getValue().compareTo(current.getData().getValue()) >0){ 
        parent = current; 
        current = current.getRight(); 
       } 
       else 
        return false; 

       if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0) 
        parent.setLeft(node); 
       else 
        parent.setRight(node); 
       } 
      } 
      size++; 
      return true; 
     } 


    /** 
    * 
    */ 
    public void inOrder(){ 
     inOrder(root); 
    } 

    private void inOrder(TreeNode root){ 
     if(root.getLeft() !=null) 
      this.inOrder(root.getLeft()); 
     System.out.println(root.getData().getValue()); 

     if(root.getRight() != null) 
      this.inOrder(root.getRight()); 
    } 



} 
+1

이 숙제입니까? –

+0

나는 hw라고 부를 수 있다고 생각한다. 나는 바이너리 트리에 대한 테스트를하고 있고, inOrder traversal은 질문 중 하나 일 수 있습니다. 나는 사물을 닦으려고하고있다. – user69514

+0

클래스에 'root'필드가있는 경우 'root'매개 변수를 사용하는 메소드가 없다는 것이 좋습니다. 이것은 일을 매우 혼란스럽게 만듭니다. –

답변

1

당신이 삽입시 제대로 트리를 통과하지 않는 것 같다, 새로운 노드에 적합한 장소를 찾을 수 있습니다. 삽입 코드가 while 루프 내부에 있기 때문에 지금 당신은 항상 루트 중 하나 자녀에 삽입하는 - 그것은 후 그것을해야한다 : 여기

public boolean insert(TreeNode node){ 

    if(root == null) 
     root = node; 

    else{ 
     TreeNode parent = null; 
     TreeNode current = root; 
     while(current != null){ 
      if(node.getData().getValue().compareTo(current.getData().getValue()) <0){ 
       parent = current; 
       current = current.getLeft(); 
      } 
      else if(node.getData().getValue().compareTo(current.getData().getValue()) >0){ 
       parent = current; 
       current = current.getRight(); 
      } 
      else 
       return false; 
     } 
     if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0) 
      parent.setLeft(node); 
     else 
      parent.setRight(node); 
     } 

     size++; 
     return true; 
    } 
+0

너희들 말이 맞아. 감사. – user69514

1

삽입 방법에 문제가 있습니다. 새 요소를 첨부 할 올바른 부모 노드를 찾지 만 전체 트리를 엉망으로 만듭니다. 당신은 while 루프에서 삽입 코드를 이동해야합니다 :

public boolean insert(TreeNode node){ 

    if(root == null) 
     root = node; 

    else{ 
     TreeNode parent = null; 
     TreeNode current = root; 
     while(current != null){ 
      if(node.getData().getValue().compareTo(current.getData().getValue()) <0){ 
       parent = current; 
       current = current.getLeft(); 
      } 
      else if(node.getData().getValue().compareTo(current.getData().getValue()) >0){ 
       parent = current; 
       current = current.getRight(); 
      } 
      else 
       return false; 
     } 

     if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0) 
      parent.setLeft(node); 
     else 
      parent.setRight(node); 
     } 

     size++; 
     return true; 
    } 
} 
0

헤이 동료 것은 간단한 일이다 ..이 밖으로 시도 .. 나를 위해 잘 작동 ...

public void levelOrderTraversal(Node root){ 
    Queue<Node> queue = new ArrayDeque<Node>(); 
    if(root == null) { 
     return; 
    } 
    Node tempNode = root; 
    while(tempNode != null) { 
     System.out.print(tempNode.data + " "); 

     if(tempNode.left != null) queue.add(tempNode.left); 
     if(tempNode.right != null) queue.add(tempNode.right); 

     tempNode = queue.poll(); 
    } 
}