final
для левого и правого поддерева не имеет особого смысла.Делая их окончательными, дерево по сути является неизменным, и как таковая операция вставки не имеет смысла.В любом случае, этот код, как мы надеемся, должен согреть процесс мышления.
public class Node {
final String value;
Node left;
Node right;
boolean copyOnWrite; //google it for more information
public Node(String value,Node left,Node right,boolean copyOnWrite) {
//blabla
}
public Node copy() { //not recursive!
copyOnWrite = true;
return new Node(value,left,right,true);
}
public Node deepCopy() { //recursive!
return new Node(value,left.deepCopy(),right.deepCopy(),false);
}
public void insert(String value) {
if (copyOnWrite) {
copyOnWrite = false;
left = left.deepCopy();
right = right.deepCopy();
}
//normal tree insert code
}
Итак, вызов copy()
быстр, что делает мелкую копию.deepCopy()
выполняется только при попытке его изменить.На самом деле, нет необходимости делать глубокую копию дерева whole , но так как это домашняя работа, я оставляю это (сколько нужно копий? Какие узлы становятся «грязными»?) В качестве упражнения:)