Двоичное дерево без вставки или поиска узла

#java #sorting #binary-tree #binary-search-tree

#Ява #сортировка #двоичное дерево #двоичное дерево поиска

Вопрос:

Я новичок в Java и программировании в целом. Код в основном работает. Он может делать все, кроме случаев, когда я ввожу следующее:

  • Последовательность: d, e, f, a, b, c, g, h, i, j.
  • Ищите: b или c

Кажется, я не могу найти никаких проблем с кодом, но сузил его до insertNode модуля/класса, похоже, что пользователи входят в a, b, c d, e, f, систему только после a регистрации узла с левой стороны.

 import java.util.Arrays; import java.util.Scanner; import java.lang.reflect.Method;  public class BinarySearchTreeTestStackOverflow {   class Node {  String stringData;  Node leftChild;  Node rightChild;  Node(String stringData) {  this.stringData = stringData;  leftChild = rightChild = null;  }  }   //root node for the binary tree  Node root;   //Constructor method  public BinarySearchTreeTestStackOverflow() {  root = null;  }   //Insert method for new values in the tree  public void insert(String key) {  root = insertNode(root, key);  }   //Insert recursive call for inserting from the root, in the right place  public Node insertNode(Node node, String key) {   if (node == null) {  node = new Node(key);   return node;  }   if (key.compareTo(node.stringData) lt; 0) {  node.leftChild = insertNode(node.leftChild, key);   } else if (key.compareTo(root.stringData) gt; 0) {  node.rightChild = insertNode(node.rightChild, key);   }  return node;  }     //Find method asking for the node to find  public Node find(String key) { //takes user input and turns it into a node  Node node = findNode(root, key);  System.out.println("print key to find: "   key);  return node;  }   //Find recursive method using the root node.  public Node findNode(Node node, String key) {   if (key.compareTo(node.stringData) == 0) {   return node;  }      //check up on findNodeMethod  if (key.compareTo(node.stringData) lt;= 0) {   if (node.leftChild == null) {  return null;  } else {  return findNode(node.leftChild, key);  }   } else if (key.compareTo(node.stringData) gt; 0) {    if (node.rightChild == null) {  return null;  } else {  System.out.println("went right"); //toDelete  return findNode(node.rightChild, key);  }  }  return null;  }     public static void main(String[] args) {  BinarySearchTreeTestStackOverflow binaryTree = new BinarySearchTreeTestStackOverflow();  Scanner scanner = new Scanner(System.in);  for (int i = 1; i lt;= 10; i  ) {   System.out.print("Enter string "   i   " for the tree: ");  binaryTree.insert(scanner.nextLine());  }    System.out.print("Enter the value to be searched: ");  String key = scanner.nextLine(); //correct, verified using - System.out.println("key to be searched: "  key);   Node node = binaryTree.find(key);   if (node == null) {  System.out.println("The string does not exist");   } else {  System.out.println("Node "   node.stringData   " was found");  }  }  }  

Ответ №1:

Проблема внутри insertNode() . Вместо того, чтобы сравнивать с root :

 else if (key.compareTo(root.stringData) gt; 0) {  node.rightChild = insertNode(node.rightChild, key); }  

вы должны сравнить с node :

 else if (key.compareTo(node.stringData) gt; 0) {  node.rightChild = insertNode(node.rightChild, key); }  

Комментарии:

1. Это ответ, я так слеп, спасибо тебе! Должен ли я закрывать/удалять этот вопрос, поскольку это так очевидно?…

2. Нет … не закрывайте и не удаляйте.