繁体   English   中英

在bfs树中查找节点的高度

[英]Find height of a node in bfs tree

我想在bfs中找到树节点的高度,但它没有用,它给了我前5个节点的正确高度,但最后两个节点不正确。 这是代码

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package bfs;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class BreadthFirstSearchExample
{ 

 private Queue<Node> queue;
 static ArrayList<Node> nodes=new ArrayList<Node>();
 static class Node
 {
  int data;
  boolean visited;
  int parent;
  int height;

  Node(int data){
   this.data=data;


  }
 }

 public BreadthFirstSearchExample()
 {
  queue = new LinkedList<Node>();
 }

 // find neighbors of node using adjacency matrix
 // if adjacency_matrix[i][j]==1, then nodes at index i and index j are connected
 public ArrayList<Node> findNeighbours(int adjacency_matrix[][],Node x)
 {
  int nodeIndex=-1;

  ArrayList<Node> neighbours=new ArrayList<Node>();
  for (int i = 0; i < nodes.size(); i++) {
   if(nodes.get(i).equals(x))
   {
    nodeIndex=i;
    break;
   }
  }

  if(nodeIndex!=-1)
  {
   for (int j = 0; j < adjacency_matrix[nodeIndex].length; j++) {
    if(adjacency_matrix[nodeIndex][j]==1)
    {
     neighbours.add(nodes.get(j));
    }
   }
  }
  return neighbours;
 }

 public  void bfs(int adjacency_matrix[][], Node node)
 {

  queue.add(node);
  node.visited=true;


  int nf =0;

  while (!queue.isEmpty())
  {
   nf = queue.size();
   Node element=queue.remove();

   System.out.print(element.data + "\t");


    System.out.print("Height" + element.height + "\t");

   ArrayList<Node> neighbours=findNeighbours(adjacency_matrix,element);
   for (int i = 0; i < neighbours.size(); i++) {
    Node n=neighbours.get(i);
    int mf = neighbours.size();

    if(n!=null && !n.visited)
    {

     n.parent=element.data;
     queue.add(n);
     n.visited=true;   
    }
    n.height++;
   element.height = n.height;
   }

  }
 }

 public static void main(String arg[])
 {

   Node node40 =new Node(40);
   Node node10 =new Node(10);
   Node node20 =new Node(20);
   Node node30 =new Node(30);
   Node node60 =new Node(60);
   Node node50 =new Node(50);
   Node node70 =new Node(70);

   nodes.add(node40);
   nodes.add(node10);
   nodes.add(node20);
   nodes.add(node30);
   nodes.add(node60);
   nodes.add(node50);
   nodes.add(node70);
   int adjacency_matrix[][] = {
     {0,1,1,0,0,0,0},  // Node 1: 40
     {1,0,0,1,0,0,0},  // Node 2 :10
     {1,0,0,1,1,1,0},  // Node 3: 20
     {0,1,1,0,1,0,0},  // Node 4: 30
     {0,0,1,1,0,0,1},  // Node 5: 60
     {0,0,1,0,0,0,1},  // Node 6: 50
     {0,0,0,0,1,1,0},  // Node 7: 70
   };
   System.out.println("The BFS traversal of the graph is ");
   BreadthFirstSearchExample bfsExample = new BreadthFirstSearchExample();
   bfsExample.bfs(adjacency_matrix, node40);

 }
}

代码的输出应该是

40高度0 10高度1 20高度1 30高度2 60高度2 50高度2 70高度3

但它却给了我输出

40高度0 10高度1 20高度1 30高度2 60高度2 50高度1 70高度2

我怎么解决这个问题?

你的bfs方法的for -loop必须如下所示:

for (int i = 0; i < neighbours.size(); i++) {
  Node n = neighbours.get(i);
  int mf = neighbours.size();

  if (n != null && !n.visited) {
    n.parent = element.data;
    queue.add(n);
    n.visited = true;
    n.height = element.height + 1;    // <- this is right
  }

  // This was wrong
  //n.height++;                    
  //element.height = n.height;
}

说明:

更改的行将受访节点的高度(“n”)设置为父节点的高度(“元素”)+ 1,但仅在第一次访问时(因此在if语句内)。 这就是你想要的,即高度。

您之前所做的是每次将节点视为邻居时增加节点的高度,而不管之前是否访问过节点。 然后将父节点的高度更改为该节点,但永远不会看到它,因为它不会再次打印。

只需更改此部分即可

if(n!=null && !n.visited)
{
    n.parent=element.data;
    queue.add(n);
    n.visited=true;
}
n.height++;
element.height = n.height;

if(n!=null && !n.visited)
{
    n.parent=element.data;
    queue.add(n);
    n.visited=true;
    n.height=element.height+1;
}
//n.height++;
//element.height = n.height;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM