2016-11-29 3 views
0

Когда я вызываю метод печати в основном методе, он ничего не печатает на консоли. Я пытаюсь создать двоичное дерево поиска в алфавитном порядке. Почему это так? Являются ли мой метод вставки и метод добавления правильными? Или это что-то не так с методом печати?Почему мой метод печати не распечатывает двоичное дерево поиска inorder?

public class Node 
{ 
    String value; 
    Node leftChild; 
    Node rightChild; 

    Node(String val,Node left, Node right) 
    { 
     value = val; 
     leftChild = left; 
     rightChild = right; 
    } 

    Node(String val) 
    { 
     value = val; 
     leftChild = null; 
     rightChild = null; 

    } 
} 

public class binarySearchTree 
{ 
    Node root; 

    binarySearchTree() 
    { 
     root = null; 
    } 

    public Node search(String element) 
    { 
     Node current = root; 
     while (element.compareTo(current.value) != 0) 
     { 
      if(current == null) 
       return null; 
      else 
      { 
       if(element.compareTo(current.value) < 0) 
       { 
        current = current.leftChild; 
       } 
       else 
       current = current.rightChild; 
      } 
     } 
     return current; 
    } 

    public Node add(String element, Node bstree) 
    { 

     if(bstree == null) 
     { 
      return new Node(element); 
     } 
     else if(element.compareTo(bstree.value) < 0) 
     { 
      bstree.leftChild = add(element, bstree.leftChild); 
     } 
     else 
     { 
      bstree.rightChild = add(element, bstree.rightChild); 
     } 

     return bstree; 
    } 

    public void insert(String element) 
    { 
     add(element,root); 
    } 


    public void print(Node bstree) 
    { 
     if(bstree != null) 
     { 
      print(bstree.leftChild); 
      System.out.print(bstree.value + " "); 
      print(bstree.rightChild); 
     } 
    }  
}  

public class testing 
{ 
    public static void main(String[] agrs) 
    { 
     binarySearchTree tree = new binarySearchTree(); 
     tree.insert("apple"); 
     tree.insert("banana"); 
     tree.insert("kiwi"); 
     tree.print(tree.root); 
    } 
} 

ответ

0

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

public Node add(String element, Node bstree) 
{ 
    if (root == null) 
    { 
     root = new Node(element); 
     return root; 
    } 

    if (bstree == null) 
    { 
     return new Node(element); 
    } 
    else if (element.compareTo(bstree.value) < 0) 
    { 
     bstree.leftChild = add(element, bstree.leftChild); 
    } 
    else 
    { 
     bstree.rightChild = add(element, bstree.rightChild); 
    } 

    return bstree; 
} 
+0

не так ли, что мой первый оператор if уже учитывает возможность того, что дерево пуст? bstree - это корень. Когда bstree равно null, дерево пусто. – Rongeegee

+0

Если корень всего дерева равен NULL, вам нужно установить root, который вы позже используете для вызова метода печати. Утверждение if, которое вы в настоящее время проверяете только в том случае, если корень данного поддерева имеет значение NULL, и тем, что вы возвращаете только новый узел. –

+0

Что вы подразумеваете под «set root»? – Rongeegee

0

Я не уверен, что это вам нужно, но я знаю, почему вы не можете распечатать все элементы. Посмотрите на своего конструктора, вы создали BinaryTree с корневым элементом, всегда равным null. В первый раз, когда вы вставляете новый элемент, функция Node add (String element, Node bstree) был вызван и возвращен новый Node(). Почему вы не назначаете новый Node текущему Btree, потому что Btree все еще null?. У нас есть несколько решений, чтобы исправить это. Это мое мнение:

  1. Создать новый застройщик:

    общественного BinarySearchTree (корневой узел) { this.root = корень; }

  2. меняет основную функцию выглядит следующим образом:

    BinarySearchTree дерево = новый BinarySearchTree (новый узел ("яблоко"));

P/s: Я создал БТР (не то же самое, что и у вас). Вы можете видеть здесь: BST-Level-Order-Traversal

Смежные вопросы