2011-03-10 10 views
31

Esto es lo que tengo. ¡Pensé que el preordenar era el mismo y lo mezclé primero con la profundidad!¿Cómo implementar un primer cruce de ancho?

import java.util.LinkedList; 
import java.util.Queue; 

public class Exercise25_1 { 
    public static void main(String[] args) { 

    BinaryTree tree = new BinaryTree(new Integer[] {10, 5, 15, 12, 4, 8 }); 

    System.out.print("\nInorder: "); 
    tree.inorder(); 
    System.out.print("\nPreorder: "); 
    tree.preorder(); 
    System.out.print("\nPostorder: "); 
    tree.postorder(); 

    //call the breadth method to test it 

    System.out.print("\nBreadthFirst:"); 
    tree.breadth(); 

    } 
} 

class BinaryTree { 
    private TreeNode root; 


    /** Create a default binary tree */ 
    public BinaryTree() { 
    } 

    /** Create a binary tree from an array of objects */ 
    public BinaryTree(Object[] objects) { 
    for (int i = 0; i < objects.length; i++) { 
     insert(objects[i]); 
    } 
    } 

    /** Search element o in this binary tree */ 
    public boolean search(Object o) { 
    return search(o, root); 
    } 

    public boolean search(Object o, TreeNode root) { 
    if (root == null) { 
     return false; 
    } 
    if (root.element.equals(o)) { 
     return true; 
    } 
    else { 
     return search(o, root.left) || search(o, root.right); 
    } 
    } 

    /** Return the number of nodes in this binary tree */ 
    public int size() { 
    return size(root); 
    } 

    public int size(TreeNode root) { 
    if (root == null) { 
     return 0; 
    } 
    else { 
     return 1 + size(root.left) + size(root.right); 
    } 
    } 

    /** Return the depth of this binary tree. Depth is the 
    * number of the nodes in the longest path of the tree */ 
    public int depth() { 
    return depth(root); 
    } 

    public int depth(TreeNode root) { 
    if (root == null) { 
     return 0; 
    } 
    else { 
     return 1 + Math.max(depth(root.left), depth(root.right)); 
    } 
    } 

    /** Insert element o into the binary tree 
    * Return true if the element is inserted successfully */ 
    public boolean insert(Object o) { 
    if (root == null) { 
     root = new TreeNode(o); // Create a new root 
    } 
    else { 
     // Locate the parent node 
     TreeNode parent = null; 
     TreeNode current = root; 
     while (current != null) { 
     if (((Comparable)o).compareTo(current.element) < 0) { 
      parent = current; 
      current = current.left; 
     } 
     else if (((Comparable)o).compareTo(current.element) > 0) { 
      parent = current; 
      current = current.right; 
     } 
     else { 
      return false; // Duplicate node not inserted 
     } 
     } 

     // Create the new node and attach it to the parent node 
     if (((Comparable)o).compareTo(parent.element) < 0) { 
     parent.left = new TreeNode(o); 
     } 
     else { 
     parent.right = new TreeNode(o); 
     } 
    } 

    return true; // Element inserted 
    } 

    public void breadth() { 
    breadth(root); 
    } 

// Implement this method to produce a breadth first 

// search traversal 
    public void breadth(TreeNode root){ 
     if (root == null) 
      return; 

     System.out.print(root.element + " "); 
     breadth(root.left); 
     breadth(root.right); 
} 


    /** Inorder traversal */ 
    public void inorder() { 
    inorder(root); 
    } 

    /** Inorder traversal from a subtree */ 
    private void inorder(TreeNode root) { 
    if (root == null) { 
     return; 
    } 
    inorder(root.left); 
    System.out.print(root.element + " "); 
    inorder(root.right); 
    } 

    /** Postorder traversal */ 
    public void postorder() { 
    postorder(root); 
    } 

    /** Postorder traversal from a subtree */ 
    private void postorder(TreeNode root) { 
    if (root == null) { 
     return; 
    } 
    postorder(root.left); 
    postorder(root.right); 
    System.out.print(root.element + " "); 
    } 

    /** Preorder traversal */ 
    public void preorder() { 
    preorder(root); 
    } 

    /** Preorder traversal from a subtree */ 
    private void preorder(TreeNode root) { 
    if (root == null) { 
     return; 
    } 
    System.out.print(root.element + " "); 
    preorder(root.left); 
    preorder(root.right); 

    } 

    /** Inner class tree node */ 
    private class TreeNode { 
    Object element; 
    TreeNode left; 
    TreeNode right; 

    public TreeNode(Object o) { 
     element = o; 
    } 
    } 

} 
+4

¿Puede ser más específico acerca de qué es exactamente lo que quiere, si usted no está buscando una respuesta? – Pops

+1

Bueno, parece que no puedo averiguar cómo hacer un recorrido transversal en mi libro ... es práctica ... no deberes. apunte en la dirección correcta ... –

+3

http://techieme.in/level-order-tree-traversal/ es lo que estaba buscando ... Sé que ya es demasiado tarde. Solo ponerlo aquí para alguien que todavía lo necesita – dharam

Respuesta

9

Parece que no está pidiendo una implementación, así que intentaré explicar el proceso.

Use una cola. Agregue el nodo raíz a la cola. Ejecute un ciclo hasta que la cola esté vacía. Dentro del ciclo dequeue el primer elemento e imprímalo. A continuación, agregue todos sus hijos al final de la cola (por lo general, yendo de izquierda a derecha).

Cuando la cola está vacía, cada elemento debería haberse impreso.

Además, hay una buena explicación de búsqueda en anchura en la wikipedia: http://en.wikipedia.org/wiki/Breadth-first_search

42

Amplitud primera es una cola, profundidad primera es una pila.

Para amplitud primero, agregue todos los elementos secundarios a la cola, luego tire de la cabeza y realice una primera búsqueda de ancho, utilizando la misma cola.

Para la profundidad primero, agregue todos los elementos secundarios a la pila, luego pop y haga una profundidad primero en ese nodo, utilizando la misma pila.

+5

y un ejemplo - [aquí] (http://edgblog.wordpress.com/2007/11/28/binary-tree-traversal/) –

+1

[LaValle] (http://planning.cs.uiuc.edu/ch2.pdf), Sec.2.2 ofrece un excelente tratamiento unificado de BFS, DFS, así como otros métodos de búsqueda. –

98

búsqueda en anchura

Queue<TreeNode> queue = new LinkedList<BinaryTree.TreeNode>() ; 
public void breadth(TreeNode root) { 
    if (root == null) 
     return; 
    queue.clear(); 
    queue.add(root); 
    while(!queue.isEmpty()){ 
     TreeNode node = queue.remove(); 
     System.out.print(node.element + " "); 
     if(node.left != null) queue.add(node.left); 
     if(node.right != null) queue.add(node.right); 
    } 

} 
+21

¿Por qué se declara la cola fuera del método? Esto fallará si se llama a width() dos veces al mismo tiempo. No puedo ver ninguna desventaja de moverlo adentro como una variable local. – Bryan

+1

@Jonah en el caso de que 'width()' se llame dos veces _concurrently_, solo hay una cola por lo que tendrá los elementos agregados dos veces y tirados al azar por cualquiera de las dos invocaciones, sin mencionar el hecho de que 'LinkedList' es no seguro para subprocesos – Bryan

4
//traverse 
public void traverse() 
{ 
    if(node == null) 
     System.out.println("Empty tree"); 
    else 
    { 
     Queue<Node> q= new LinkedList<Node>(); 
     q.add(node); 
     while(q.peek() != null) 
     { 
      Node temp = q.remove(); 
      System.out.println(temp.getData()); 
      if(temp.left != null) 
       q.add(temp.left); 
      if(temp.right != null) 
       q.add(temp.right); 
     } 
    } 
} 

}

1

Este código que has escrito, no está produciendo correcta BFS recorrido: (Este es el código que se reclaman es una BFS, pero en realidad esto es DFS!)

// search traversal 
    public void breadth(TreeNode root){ 
     if (root == null) 
      return; 

     System.out.print(root.element + " "); 
     breadth(root.left); 
     breadth(root.right); 
} 
+2

Esto es primero en profundidad (pre-pedido recorrido). – Kreisquadratur

+1

@Kreisquadratur, ¿leíste mi comentario sobre el código? Quise decir "tu código, que he copiado a continuación no es BFS". Nadie mencionó eso. Pero este código no es BFS, es DFS. (Actualicé un poco para ser más claro) – Hengameh

+1

Me confundí con los muchos "esto". – Kreisquadratur

-3
public static boolean BFS(ListNode n, int x){ 
     if(n==null){ 
      return false; 
     } 
Queue<ListNode<Integer>> q = new Queue<ListNode<Integer>>(); 
ListNode<Integer> tmp = new ListNode<Integer>(); 
q.enqueue(n); 
tmp = q.dequeue(); 
if(tmp.val == x){ 
    return true; 
} 
while(tmp != null){ 
    for(ListNode<Integer> child: n.getChildren()){ 
     if(child.val == x){ 
      return true; 
     } 
     q.enqueue(child); 
    } 

    tmp = q.dequeue(); 
} 
return false; 
} 
+0

No creo que necesite cola aquí en absoluto. –

6
public void breadthFirstSearch(Node root, Consumer<String> c) { 
    List<Node> queue = new LinkedList<>(); 

    queue.add(root); 

    while (!queue.isEmpty()) { 
     Node n = queue.remove(0); 
     c.accept(n.value); 

     if (n.left != null) 
      queue.add(n.left); 
     if (n.right != null) 
      queue.add(n.right); 
    } 
} 

y el nodo:

public static class Node { 
    String value; 
    Node left; 
    Node right; 

    public Node(final String value, final Node left, final Node right) { 
     this.value = value; 
     this.left = left; 
     this.right = right; 
    } 
} 
Cuestiones relacionadas