2016-11-26 3 views
1

Я пытаюсь использовать поиск глубины первого, чтобы найти вершину/узел в дереве. Я был в состоянии создать алгоритм DFS, но я не знаю, как преобразовать дерево кода, так что я могу обрабатывать его через алгоритм, как в ссылке ниже JavaScript Depth-first searchПоиск узла в дереве с использованием глубины первого поиска

Это было то, что я был в состоянии сделать

Vertex nodeA = new Vertex(); 
    Vertex nodeB = new Vertex(); 
    Vertex nodeC = new Vertex(); 
    Vertex nodeD = new Vertex(); 
    Vertex nodeE = new Vertex(); 
    Vertex nodeF = new Vertex(); 
    Vertex nodeG = new Vertex(); 
    Vertex nodeH = new Vertex(); 

    nodeA.name = "a"; 
    nodeB.name = "b"; 
    nodeC.name = "c"; 
    nodeD.name = "d"; 
    nodeE.name = "e"; 
    nodeF.name = "f"; 
    nodeG.name = "g"; 
    nodeH.name = "h"; 

    nodeA.nextNeighbor.add(nodeB); 
    nodeA.nextNeighbor.add(nodeC); 
    nodeB.nextNeighbor.add(nodeD); 
    nodeB.nextNeighbor.add(nodeE); 
    nodeB.nextNeighbor.add(nodeF); 
    nodeC.nextNeighbor.add(nodeG); 
    nodeG.nextNeighbor.add(nodeH); 

Это древовидная структура.

a 
/\ 
    b c 
/|\ \ 
d e f g 
     | 
     h 

Это мой код

class Neighbor { 
     public int vertexNum; 
     public Neighbor next; 
     public Neighbor(int vnum, Neighbor nbr) { 
       this.vertexNum = vnum; 
       next = nbr; 
     } 
    } 

    class Vertex { 
     String name; 
     Neighbor adjList; 
     Vertex(String name, Neighbor neighbors) { 
       this.name = name; 
       this.adjList = neighbors; 
     } 
    } 
private void dfs(int v, boolean[] visited) { 
     visited[v] = true; 
     System.out.println("visiting " + adjLists[v].name); 
     for (Neighbor nbr=adjLists[v].adjList; nbr != null; nbr=nbr.next) { 
      if (!visited[nbr.vertexNum]) { 
       System.out.println("\n" + adjLists[v].name + "--" + adjLists[nbr.vertexNum].name); 
       dfs(nbr.vertexNum, visited); 
      } 
     } 
    } 

public void dfs() { 
     boolean[] visited = new boolean[adjLists.length]; 
     for (int v=0; v < visited.length; v++) { 
      if (!visited[v]) { 
       System.out.println("\nSTARTING AT " + adjLists[v].name); 
       dfs(v, visited); 
      } 
     } 
    } 
+0

Вы в основном используете структуру данных FIFO (массив/очередь), которая будет пересекать дерево в BFS. Вам понадобится использовать структуру данных LIFO (стек), чтобы получить обход DFS. – user1952500

+0

@ user1952500 Вы имеете в виду что-то вроде того, что я разместил ниже? –

+0

Если вы хотите ответить другим пользователям с новым кодом, отредактируйте сообщение, а не ответьте с кодом, в котором вы не уверены (если он действительно не отвечает на начальный вопрос) –

ответ

0

Вы имеете в виду что-то вроде этого?

public enum State { 
    Unvisited, Visited, Visiting; 
    } 
// let the start node and the end node be both the nodes. 

// Implementation using DFS. 
    public static boolean search(Graph g, Node start, Node end) { 
      LinkedList<Node> stack = new LinkedList<Node>(); // operates as Stack 
      for (Node u : g.getNodes()) { 
      u.state = State.Unvisited; 
      } 
      start.state = State.Visiting; 
      stack.add(start); 
      Node u; 
      while(!stack.isEmpty()) 
      { 
        u = stack.removeFirst(); // i.e., pop() 
        if (u != null) { 
        for (Node v : u.getAdjacent()) { 
         if (v.state == State.Unvisited) { 
          if (v == end) { 
           return true; 
          } 
          else { 
           v.state = State.Visiting; 
           stack.add(v); 
          } 
         } 
        } 
       u.state = State.Visited; 
        } 
      } 
    return false; 
    } 
+0

Ответит ли это на вопрос ? Если нет, отредактируйте вопрос выше –

+0

@ cricket_007 Я просто хочу знать, как создать код для дерева, используемого с алгоритмом. –

+0

Я понимаю, но вы задали вопрос как ответ на свой вопрос. –

Смежные вопросы