Частично причина этого в том, что «Узел» не должен быть параметром для метода вставки, вы должны вызывать метод вставки, определенный в узле.
Итак, давайте предположим, что вы держите узел "Root" в своем "нормальном коде" - давайте назовем его "rootNode" просто для неясности.
Хорошо, ваш код для вставки в дерево будет:
rootNode.insert(newValue);
Достаточно просто.
Теперь, чтобы определить этот метод.
public class Node {
private int value;
private Node lower;
private Node higher;
public void insert(int newValue) {
if (newValue < value)
if(lower == null)
lower=new Node(value);
else
lower.insert(newValue);
else
if(higher == null)
higher=new Node(value);
else
higher.insert(newValue);
}
// and you'll need a constructor
public Node(int value) {
this.value=value;
}
}
Это должно читаться намного яснее. Я собираюсь нажать «Пост», затем я отредактирую его и пойму, как легко преломить этот злой злой код для копирования и вставки.
Если подумать, я оставлю это там, потому что это более читабельно. Лучшее исправление, которое я вижу, это сделать узлы массивом, тогда вы получите:
public class Node {
private int value;
private Node[] nodes=new Node[2];
private final int LOWER=0;
private final int HIGHER=1;
public void insert(int newValue) {
int index=LOWER;
if (newValue > value)
index=HIGHER;
if(nodes[index] == null)
nodes[index]=new Node(value);
else
nodes[index].insert(newValue);
}
}
Но я не буду заменять оригинал, потому что, как я уже сказал, он понятнее.
Я рекомендую книгу по рефакторингу для получения дополнительной информации. Это действительно помогает упростить ваш код, как только вы действительно получите OO. Передача объекта в другой статический метод (метод, который не использует переменные-члены) - пустая затея.
С дополнительными соображениями относительно комментария @ ted и OO - getLeft и getRight даже не должны быть проблемой. За абстракцией нет необходимости.
В общем, вам, вероятно, нужны следующие методы в Node:
public boolean doesContain(int value) {
if(value == this.value)
return true
else
return nodes[ this.value < value ? LOWER : HIGHER].doesContain(value);
}
и, возможно,
public void getValuesSorted(LinkedList l) {
nodes[LOWER].getValuesSorted(l);
l.put(value);
nodes[HIGHER].getValuesSorted(l);
}
Тогда вам даже не нужно показывать, что это дерево, с которым вы имеете дело - лучше абстракция OO.