【问题标题】:Inserting nodes into a tree Breadth First将节点插入树中广度优先
【发布时间】:2018-04-09 09:14:56
【问题描述】:

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

如果我打电话 插入节点(10) 插入节点(8) 插入节点(20) 插入节点(5) 插入节点(29) 插入节点(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);
        }
    }
}

【问题讨论】:

  • 如果数据已经处于“广度优先顺序”,那么只需普通插入到树中即可。我想我曾经解决过这个问题,这很好。您确定您的插入方法也适用于普通数据吗?我会先尝试让它工作,可能是一个简单的编程错误。
  • 关于您的示例数据的一件事,29 应该在右侧节点上,而不是您所展示的左侧。要搜索 29,任何正常的搜索方法都会直接从 10(根)开始,永远找不到 29。那一定是错误的。
  • @markspace 我需要生成树的顺序如我所示。将每个节点插入到树的每一层的最左边。

标签: java tree breadth-first-search


【解决方案1】:

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

我正在生成第一个节点,我在树中插入了两次。

这是因为我打电话

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

对于第一个节点,但随后没有中断该方法,而是调用了其余代码,该代码生成了两次第一个节点。一个简单的 else 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;
            }
        }
    }




}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多