2010-04-24 2 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. У меня есть тест на двоичных деревьях, и обход обхода может быть одним из вопросов. Я просто пытаюсь разобраться в вещах. – 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

У вас возникли проблемы с вставкой. Он находит правильный родительский узел для присоединения нового элемента, но по пути он испортил все дерево. Вы должны переместить код вставки из цикла в то время:

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(); 
    } 
}