当前位置: 首页 > 知识库问答 >
问题:

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

松俊美
2023-03-14

我有一个表示二叉树节点的树节点的树节点。

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要做的就是,如果所讨论的节点没有左子节点,那么创建一个左子节点并将当前节点的左侧对象设置为子对象。

如果有问题的节点有一个左边的子节点,那么检查这个子节点,并通过为有问题的节点的子节点调用相同的函数来查看新节点应该插入左边还是右边...我不明白为什么当我设置孩子的键值时,node的(传递的TreeNode对象)键会更新。

共有2个答案

闾丘成双
2023-03-14

我不太明白你的意思

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

但是我注意到了一件会导致错误的事情:

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

当 node.getKey() == 元素时,这意味着 bst 已经有一个以“元素”为键的节点,这应该是另一种特殊情况。相反,你仍然在穿越它正确的孩子。

另外,如果你能更清楚地阐述你的错误就好了…

澹台新知
2023-03-14

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

 类似资料:
  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我搜索了一下,但没有找到这个问题的答案... 我构建了一个非二叉树,因此每个节点可以有任意数量的子节点(我认为称为n元树) 为了有助于搜索,我在构建树的时候给了每个节点一个编号,这样每个节点的子节点会更大,它右边的所有节点也会更大。 像这样的东西: 这样我就有更多的时间进行搜索 当我想插入节点时,问题就来了。如果我想在除了结尾以外的任何地方插入节点,这个模型就不起作用了。 我想了几种方法可以做到这

  • 我正在研究数据结构,我遇到了一个难题。目标是根据数组元素的值将数组元素插入到二叉搜索树中,即(主树的根节点为数组[0],左子树的根_node小于父节点,右子树的根节点大于父节点)。这将递归进行,直到所有数组元素都插入BST。 我实现了两个类: 这表示具有属性的节点(数据,左,右): 是BST的私有方法,它执行将节点插入树的实际工作。我将其与分开,因为需要使用RSpec评估的预期解决方案。 然后,我

  • public static void main(String[]args){main main=new main();

  • 本文向大家介绍C#二叉搜索树插入算法实例分析,包括了C#二叉搜索树插入算法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#二叉搜索树插入算法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。