Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BFS图遍历-将新节点附加到邻接矩阵_Java_Algorithm_Swing_Jpanel - Fatal编程技术网

Java BFS图遍历-将新节点附加到邻接矩阵

Java BFS图遍历-将新节点附加到邻接矩阵,java,algorithm,swing,jpanel,Java,Algorithm,Swing,Jpanel,我正在尝试创建一个程序,让您从图形中附加和删除节点,然后运行BFS和DFS遍历 所以我最初在运行时添加和连接节点。。。然后,我想让用户点击一个将子项添加到父项按钮,该按钮会适当地附加一个子项 AddButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Nodes nX = new Nodes("X

我正在尝试创建一个程序,让您从图形中附加和删除节点,然后运行BFS和DFS遍历

所以我最初在运行时添加
连接
节点。。。然后,我想让用户点击一个
将子项添加到父项
按钮,该按钮会适当地附加一个子项

AddButton.addActionListener(new ActionListener() {   
        public void actionPerformed(ActionEvent e)
        {   
            Nodes nX = new Nodes("X", nodeX, nodeY, nodeWidth, nodeHeight);
            appendNode(rootNode, nX);
        }
   });  

}
当我尝试附加一个新节点时,它似乎覆盖了当前的邻接矩阵,并将其替换为单个新节点
X
,作为
a
的子节点

我想我知道它为什么这么做。。。因为my
appendNode()
函数试图通过覆盖旧的邻接矩阵并创建具有新节点列表大小的新邻接矩阵来更新邻接矩阵:

public void appendNode(Nodes parent, Nodes child) {
    //add new node X to nodeList
    addNode(child);

    //loop through all nodes again to be connected, plus new one... then create new adjMatrix
    System.out.println(nodeList.size());
    size = nodeList.size();

    adjMatrix = null;
    adjMatrix = new int[size][size];

    int fromNode = nodeList.indexOf(parent);
    int toNode = nodeList.indexOf(child);
    adjMatrix[fromNode][toNode] = 1;
    adjMatrix[toNode][fromNode] = 0;

}

public void addNode(Nodes n) {
    nodeList.add(n);
}
但我不知道还有什么别的方法可以在不覆盖它的情况下实现我想要的

有什么想法吗

谢谢


仅供参考,以下是连接节点方法:

public void connectNode(Nodes from, Nodes to)
{
    //if matrix is empty..
    if(adjMatrix == null)
    {
        //set matrix [row][col] size to size of nodesList list
        size = nodeList.size();
        //set dimensions of adj matrix... (6x6 nodesList)

        adjMatrix = new int[size][size];
    }

    int fromNode = nodeList.indexOf(from);
    int toNode = nodeList.indexOf(to);

    //connect node A to B and B to A, set that i,j position = 1
    adjMatrix[fromNode][toNode] = 1;
    adjMatrix[toNode][fromNode] = 0;

}

编辑:

public void appendNode(Nodes parent, Nodes child) {
    //add new node X to nodeList
    addNode(child);

    //loop through all nodes again to be connected, plus new one... then create new adjMatrix
    int newSize = nodeList.size();

    //make a new adj matrix of the new size...
    int[][] adjMatrixCopy = new int[newSize][newSize];

    int fromNode = nodeList.indexOf(parent);
    int toNode = nodeList.indexOf(child);
    adjMatrixCopy[fromNode][toNode] = 1;
    adjMatrixCopy[toNode][fromNode] = 0;


    //copy adjMatrix data to new matrix...
    for (int i = 0; i < adjMatrix.length; i++) {    
        for (int j = 0; j < adjMatrix[i].length; j++) {
            adjMatrixCopy[i][j] = adjMatrix[i][j];
        }
    }

    //still need to add newly added node 

    //adjMatrix = null;
}
公共节点(节点父节点、节点子节点){
//将新节点X添加到节点列表
addNode(子节点);
//再次循环所有要连接的节点,加上新节点…然后创建新的调整矩阵
int newSize=nodeList.size();
//创建新大小的新调整矩阵。。。
int[][]adjMatrixCopy=新int[newSize][newSize];
int fromNode=nodeList.indexOf(父节点);
int toNode=nodeList.indexOf(child);
adjMatrixCopy[fromNode][toNode]=1;
adjMatrixCopy[toNode][fromNode]=0;
//将调整矩阵数据复制到新矩阵。。。
对于(inti=0;i
通过将邻接矩阵置空,并将其替换为具有更新大小的新矩阵,除(from,to)和(to,from)外的所有单元格都将为零。您需要使用新的大小创建新的邻接矩阵,从旧矩阵复制数据,然后才覆盖旧矩阵。

为什么不创建邻接列表?或者使用集合的邻接矩阵,这些集合可以动态递增


我认为使用数组会导致这个长期存在的问题。如果要使用邻接矩阵,则应使用集合。也就是说,如果你只是做一个BFS,邻接列表会工作得更快,所以我建议你这样做。

我已经试着按照你上面说的做了。我已经能够从原始矩阵中复制旧数据。。。但是如何添加下一个节点?参见上面编辑的代码。谢谢据我所知,你差不多完成了。将新节点添加到邻接矩阵与添加新行/列对一样简单,您已经完成了这项工作。您还添加了一条新边。(行
adjMatrixCopy[toNode][fromNode]=0;
是多余的,因为java变量被初始化为0。)除非我弄错了,否则您可以直接执行
adjMatrixCopy=adjMatrixCopy在最后,你就完成了。是的,我从那时起就这样做了,效果很好。除此之外,矩阵被更改(
X
作为行和列添加到调整矩阵)。。。但由于某些原因,节点
X
未在图形上显示为附加节点