У меня есть класс TreeNode, представляющий узел двоичного дерева.
public class TreeNode {
private static Object key=null;
private static Object value=null;
private TreeNode parent;
private TreeNode left=null;
private TreeNode right=null;
/**
* @return the value
*/
public static Object getValue() {
return value;
}
/**
* @param aValue the value to set
*/
public static void setValue(Object aValue) {
value = aValue;
}
public TreeNode()
{
this(key,value);
}
public TreeNode(Object key,Object value)
{
this.key = key;
this.value = value;
}
/**
* @return the key
*/
public Object getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(Object key) {
this.key = key;
}
/**
* @return the parent
*/
public TreeNode getParent() {
return parent;
}
/**
* @param parent the parent to set
*/
public void setParent(TreeNode parent) {
this.parent = parent;
}
/**
* @return the left
*/
public TreeNode getLeftChild() {
return left;
}
/**
* @param left the left to set
*/
public void setLeftChild(TreeNode left) {
this.left = left;
}
/**
* @return the right
*/
public TreeNode getRightChild() {
return right;
}
/**
* @param right the right to set
*/
public void setRightChild(TreeNode right) {
this.right = right;
}
}
У меня есть класс BinarySearchTree
public class BinarySearchTree implements DataStructures.interfaces.BinarySearchTree {
private int size=0;
private TreeNode root = new TreeNode();
@Override
public void insert(Object key, Object value)
{
insertOperation(key,value,root);
}
private void insertOperation(Object element, Object value, TreeNode node)
{
if(node.getKey() == null) {
node.setKey(element);
node.setValue(value);
}
else
{
if((int) node.getKey() > (int) element)
{
if(node.getLeftChild() != null)
insertOperation(element,value,node.getLeftChild());
else
{
TreeNode child = new TreeNode(element, value);
child.setKey(element);
child.setValue(value);
child.setParent(node);
node.setLeftChild(child);
size++;
}
}
else if((int) node.getKey() <= (int) element)
{
if(node.getRightChild() != null)
insertOperation(element,value,node.getRightChild());
else
{
TreeNode child = new TreeNode(element, value);
child.setKey(element);
child.setValue(value);
child.setParent(node);
node.setRightChild(child);
size++;
}
}
}
}
///more methods
}
Проблема в том, что когда я создаю дочерний узел и устанавливаю родительскую дочернюю ссылку. Значение родительского узла (объект узла, который я передал) также обновляется и ссылается на дочерний объект.
Это не мое намерение.
Я хочу создать цепочку объектов treenode, к которым можно получить доступ через «корневой» объект treenode.
Но этого не происходит и я не понимаю, что я делаю не так.
Я знаю, что проблема заключается в логике этого фрагмента кода (не только для вставки слева, но и для вставки левого потомка и правого), но я не понимаю, что именно.
if(node.getLeftChild() != null)
insertOperation(element,value,node.getLeftChild());
else
{
TreeNode child = new TreeNode(element, value);
child.setKey(element);
child.setValue(value);
child.setParent(node);
node.setLeftChild(child);
size++;
}
Все, что я говорю java, это если у рассматриваемого узла нет левого дочернего элемента, тогда создайте левый дочерний узел и установите левый объект текущего узла в дочерний объект.
если у рассматриваемого узла есть левый дочерний элемент, проверьте этот дочерний элемент и посмотрите, должен ли новый узел быть вставлен слева или справа, вызвав ту же функцию для дочернего элемента рассматриваемого узла... Я не понимаю, почему узел (передан объект TreeNode) ключ обновляется, когда я устанавливаю значение дочернего ключа.