将节点插入树中广度优先

时间:2018-04-09 00:00:21

标签: java tree breadth-first-search

我正在尝试使用广度优先插入方式生成树。 我试图通过以广度优先顺序生成包含树中所有元素的List来完成此操作。然后在我的insertNode方法中,我检查节点是否需要带有一个名为needsChildren()的方法的子节点,如果是,我将添加我插入到最左边点的树中的节点。

如果我打电话的话 insertNode(10) insertNode(8) insertNode(20) insertNode(5) insertNode(29) insertNode(50)

生成的树应该是

          10
    8           20

5      29    50

依旧......

此解决方案无效,我不太清楚为什么。我认为我的generateList可能无法正常工作,但我检查了最后打印的列表,看起来是对的。

有没有更好的方法来做到这一点,或者我的代码中有一个我找不到的问题。任何帮助都非常感谢。

这是我的TreeNode类:

private static class TreeNode<T> {

    public T data;
    public TreeNode<T> left;
    public TreeNode<T> right;

    public TreeNode(T d) {
                    data = d;
                    left = null;
                    right = null;
    }
}

我的insertNode方法:

public void insertNode(T d) { 

    if(root==null){
        root= new TreeNode<T>(d);             
    }

    genList(root);

    if(needsChildren(nodesThatNeedChildren.get(0))){
        if(nodesThatNeedChildren.get(0).left==null){
            nodesThatNeedChildren.get(0).left= new TreeNode<T>(d);
        }else{
            nodesThatNeedChildren.get(0).right= new TreeNode<T>(d);
        }
    }else{
        while(!needsChildren(nodesThatNeedChildren.get(0))){
            nodesThatNeedChildren.remove(0);

        }
        System.out.println(nodesThatNeedChildren.get(0).data);


        if(nodesThatNeedChildren.get(0).left==null){
            nodesThatNeedChildren.get(0).left = new TreeNode<T>(d);
        }else{
            nodesThatNeedChildren.get(0).right = new TreeNode<T>(d);
        }
    }


}

检查节点是否需要子节点的方法:

public boolean needsChildren(TreeNode<T> node){
    if(node.left==null || node.right ==null){
        return true;
    }
    return false;
}

我的方法生成树中所有节点的列表:

public void genList(TreeNode<T> root) {
    //generate new List each time
    nodesThatNeedChildren.clear();
    nodesThatNeedChildren.add(root);

    //generate new Queue each time genList is called
    tempQueue.clear();
    tempQueue.add(root);

    while(!tempQueue.isEmpty()){

        TreeNode<T> node = tempQueue.remove(0);

        if(node.left != null){ 
            tempQueue.add(node.left);
            nodesThatNeedChildren.add(node.left);
        }     

        if(node.right != null){
            tempQueue.add(node.right);
            nodesThatNeedChildren.add(node.right);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我经过一些调试后设法找到了我的错误。这个问题出在我的insertNode()方法中。

我正在生成我在树中插入两次的firstNode。

这是因为我致电

if(root==null){
    root= new TreeNode<T>(d);             
}

对于第一个节点,但之后没有突破该方法,而是调用其余代码,然后生成第一个节点两次。一个简单的if语句解决了这个问题。已解决的代码如下所示。

public void insertNode(T d) { 


    if(root==null){
        root= new TreeNode<T>(d); 
        size+=1;    

    }
    else if(root!=null){
        genList(root);
        if(needsChildren(nodesThatNeedChildren.get(0))){
            if(nodesThatNeedChildren.get(0).left==null){
                nodesThatNeedChildren.get(0).left= new TreeNode<T>(d);
                size+=1;
            }else{
                nodesThatNeedChildren.get(0).right= new TreeNode<T>(d);
                size+=1;
            }
        }else{
            while(!needsChildren(nodesThatNeedChildren.get(0))){
                nodesThatNeedChildren.remove(0);

            }

            if(nodesThatNeedChildren.get(0).left==null){
                nodesThatNeedChildren.get(0).left = new TreeNode<T>(d);
                size+=1;
            }else{
                nodesThatNeedChildren.get(0).right = new TreeNode<T>(d);
                size+=1;
            }
        }
    }




}