Java二进制树插入不正常

时间:2015-10-22 15:14:28

标签: java recursion insert binary-tree nodes

当我添加一个节点时,例如,在insert方法中命名为“Bob”:

public void insert(String aLabel){
    //left recursion:
    if(this.getLabel().compareTo(aLabel) <= 0) {
        if (childrenLeft == null) {
            BSTreeNode aNode = new  BSTreeNode(aLabel,this);
            return;
        }
    else {
            childrenLeft.insert(aLabel);
        }
    }
    //right recursion
    else {
        if (childrenRight==null) {
            BSTreeNode aNode = new BSTreeNode(aLabel,this);
            return;
        }
    else{
            childrenRight.insert(aLabel);
        }

    }

}

我的树只在树的左侧添加一个没有标签的空白节点。 (BSTreeNode aNode = new BSTreeNode;)有什么问题吗?因为当我对节点进行硬编码时:

BSTreeNode Louis = new BSTreeNode("Louis", treeRoot);
BSTreeNode bonny = new BSTreeNode( "bonny", treeRoot);
BSTreeNode Sue = new BSTreeNode("Anne", bonny);
BSTreeNode Sam = new BSTreeNode("Sam",Louis);
BSTreeNode Anne2 = new BSTreeNode( "delta", bonny);
BSTreeNode Frank = new BSTreeNode("Kalle", Louis);

树显示标签并插入所需位置。 其他代码 - 构造函数:

public BSTreeNode( String aLabel,BSTreeNode aParent){
    label = aLabel;
    parent = aParent;
 //add this node as a child of this node's parent either left or right

    if(parent != null){
        if(parent.getLabel().compareTo(label)<= 0) {
            parent.addLeftChild(this);
        }
        if(parent.getLabel().compareTo(label)> 0) {
            parent.addRightChild(this);
        }

    }

}

这是在创建节点时将节点添加到父节点的构造函数。 添加childleft和正确的方法:

private void addLeftChild(BSTreeNode aNode){
    if(childrenLeft == null) this.childrenLeft = aNode;

}
private void addRightChild(BSTreeNode aNode) {
    if(childrenRight == null) this.childrenRight = aNode;

}

2 个答案:

答案 0 :(得分:0)

大多数二叉树遵循不同的风格,并在递归方法中设置父母的左/右孩子,而不是孩子上升并告诉某人它是他们的新父母

对于大多数二叉树的运行方式,此代码更为标准:

public void insert(String aLabel)
{
    if(getLabel().compareTo(aLabel) <= 0)
        if(childrenLeft == null)
            childrenLeft = new BSTreeNode(aLabel, this);
        else
            childrenLeft.insert(aLabel);
    else
        if(childrenRight == null)
            childrenRight = new BSTreeNode(aLabel, this);
        else
            childrenRight.insert(aLabel);
}

该代码应该正确保存正在创建的BSTreeNodes的值,并且具有额外的效果,即减少关于父母如何获得它的孩子的混淆

对于大多数人来说,让父母生孩子,而不是让孩子到达一个节点并告诉它是街区的新孩子,这对我们来说更有意义

答案 1 :(得分:0)

你的逻辑可能有点瑕疵。

从构建器添加时,您直接调用addLeftChildaddRightChild。这些函数检查右/左节点是否为null,如果为空,则添加该值。但是如果它不是空的呢。然后它应该与左/右孩子进行比较并继续,否则节点不会被添加(即,功能通过&amp;不返回任何内容作为其void)。