2014-11-26 3 views
0

이것은 이 아니며이 아닌 BinarySearchTree입니다. 일반적인 이진 트리입니다. 여기삽입 메서드가 작동하지 않습니다. 이진 트리 Java

public class RegularTree extends BinaryTree { 

    public RegularTree() { 
     super(); 
    } 

    public void insert(Comparable item) { 
     if(this.isEmpty()) { 
      this.setRoot(new TreeNode(item)); 
      return; 
     } 

     TreeNode t = this.getRoot(); 
     while(t != null) { 
      if(t.getLeft() == null) 
       t.setLeft(new TreeNode(item)); 
      else if(t.getRight() == null) 
       t.setRight(new TreeNode(item)); 
      else { 
       if(size(t.getLeft()) > size(t.getRight())) 
        t = t.getRight(); 
       else 
        t = t.getLeft(); 
      } 
     } 
    } 

    public int size(TreeNode node) { 
     return(getSize(node)); 
    } 

    private int getSize(TreeNode node) { 
     if (node == null) 
      return(0); 
     else 
      return(getSize(node.getLeft()) + 1 + getSize(node.getRight())); 
    } 

    public TreeNode find(Comparable key) { 
     TreeNode p = this.getRoot(); 
     while(p != null && key.compareTo(p.getValue()) != 0) { 
      if(key.compareTo(p.getValue()) < 0) 
       p = p.getLeft(); 
      else 
       p = p.getRight(); 
     } 
     return p; 
    } 

    public void inorder() { 
     doInorderTraversal(this.getRoot()); 
    } 

    private void doInorderTraversal(TreeNode t) { 
     if(t != null) { 
      doInorderTraversal(t.getLeft()); 
      System.out.print(t.getValue() + " "); 
      doInorderTraversal(t.getRight()); 
     } 
    } 

} 

내 주요 방법 :

   1 
      / \ 
      2  3 
     /\ /
     4 5 6 

나무 :

public static void main(String[] args) { 
    RegularTree tree = new RegularTree(); 
    tree.setRoot(new TreeNode(1)); 
    tree.insert(2); 
    tree.insert(3); 
    tree.insert(4); 
    tree.insert(5); 
    tree.insert(6); 
    tree.inorder(); 
} 

이이처럼 보이는 나무를 생성해야

여기 내 RegularTree 클래스입니다. inorder()는 트리의 inorder 순회를 수행해야합니다. 즉, 출력해야 함을 의미합니다. 4 2 5 1 6 3

그러나 메인 메서드를 실행할 때 아무 일도 일어나지 않습니다. 내 삽입 방법에 문제가 있다고 생각하지만 확실하지 않습니다.

+0

내가 한 –

+0

가 다른 문제가 될,하지만 난 삽입 방법은 {오른쪽, 왼쪽} t.set를 호출 한 후 루프를 종료해야한다고 생각 당신이 말했듯이 나무가 지금 삽입 중입니다. 그러나, 내 inorder() 메서드는 다음 숫자를 인쇄합니다 : 4 2 6 1 5 3 어떤 이유로 5와 6 잘못된 위치에 가고 있습니다. inorder() 메서드에 문제가 있다고 생각하지 않습니다. 내 BinarySearchTree에서 제대로 작동했기 때문입니다. – zaynv

답변

0

위의 내 의견에서 언급했듯이 {Left, Right}을 (를) 호출 한 후 돌아와야합니다. 난 그냥 코드에서 수정을 테스트하고 4 2 5 1 6 3 기대했다.

코드에서 다른 부분을 수정하지 않았습니다.

나는 아래의 수정 된 버전을 포함하고있다 :

public class BinaryTree { 

TreeNode root; 


public int size(TreeNode node) { 
    return(getSize(node)); 
} 

private int getSize(TreeNode node) { 
    if (node == null) 
     return(0); 
    else 
     return(getSize(node.getLeft()) + 1 + getSize(node.getRight())); 
} 

public void insert(Comparable item) { 
    if(this.getRoot() == null) { 
     this.setRoot(new TreeNode(item)); 
     return; 
    } 

    TreeNode t = this.getRoot(); 
    while(t != null) { 
     if(t.getLeft() == null) { 
      t.setLeft(new TreeNode(item)); 
      return; 
     } 
     else if(t.getRight() == null) { 
      t.setRight(new TreeNode(item)); 
      return; 
     } 
     else { 
      if(size(t.getLeft()) > size(t.getRight())) 
       t = t.getRight(); 
      else 
       t = t.getLeft(); 
     } 
    } 
} 





public TreeNode getRoot() { 
    return root; 
} 

public void setRoot(TreeNode root) { 
    this.root = root; 
} 

public void inorder() { 
    doInorderTraversal(this.getRoot()); 
} 

private void doInorderTraversal(TreeNode t) { 
    if(t != null) { 
     doInorderTraversal(t.getLeft()); 
     System.out.print(t.getValue() + " "); 
     doInorderTraversal(t.getRight()); 
    } 
} 

public static void main(String[] args) { 
    BinaryTree tree = new BinaryTree(); 
    tree.setRoot(new TreeNode(1)); 
    tree.insert(2); 
    tree.insert(3); 
    tree.insert(4); 
    tree.insert(6); 
    tree.insert(5); 
    tree.inorder(); 

} 
    } 
+0

죄송합니다. 삽입을 잘못했기 때문입니다. 5가 6 앞에 삽입되어야합니다. 어떤 이유로 인해 5와 6의 자리가 바뀝니다. – zaynv

+0

왜 이것이 잘못되었다고 생각합니까? 순서에 관계없이 여전히 이진 트리가 있습니다. –