在Java中实现二进制搜索树插入操作

时间:2013-10-30 03:46:31

标签: java data-structures binary-search-tree insertion

我有一个表示二叉树节点的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
}

问题在于,当我创建子节点并设置父子链接时。父节点(我传递的节点对象)的值也会更新并引用子对象。

这不是我的意图。

我想创建一个可以通过“root”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要做的就是所讨论的节点没有左子节点然后创建一个左子节点并将当前节点的左侧对象设置为子对象。

如果有问题的节点确实有一个左子,那么检查那个孩子,看看是否应该通过为相关节点的子节点调用相同的函数向左或向右插入新节点...我不知道当我设置child的键值时,理解为什么节点(传递的TreeNode对象)键被更新。

2 个答案:

答案 0 :(得分:1)

我不明白你的意思

  

问题在于,当我创建子节点并设置父子链接时。父节点(我传递的节点对象)的值也会更新并引用子对象。

但我确实注意到会导致错误的一件事:

    else if((int) node.getKey() <= (int) element)

当node.getKey()== element时,表示bst已经有一个以“element”为键的节点,这应该是另一种特殊情况。相反,你仍然穿越它的右孩子。

另外,如果你能更清楚地详细说明你的错误会很好......

答案 1 :(得分:1)

为什么您的keyvalue静态对象?这意味着所有TreeNode将共享相同的键/值。删除static关键字,它应该可以正常工作。