2011-03-10 96 views
31

這就是我所擁有的。我認爲預購是一樣的,先把它與深度混合起來!如何實現廣度優先遍歷?

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

你能具體談談你想要什麼,如果你不尋找一個答案? – Pops 2011-03-10 16:08:56

+1

好吧,我似乎無法找到如何在我的書中做廣度第一次遍歷......這是實踐......不是作業。指向正確的方向... – 2011-03-10 16:12:33

+3

http://techieme.in/level-order-tree-traversal/是你在找什麼..我知道這太晚了。只是把它放在這裏,對於那些仍然需要它的人 – dharam 2015-03-29 17:36:23

回答

9

它似乎不像你要求的實現,所以我會嘗試解釋過程。

使用隊列。將根節點添加到隊列。有一個循環運行,直到隊列爲空。在循環內出列第一個元素並將其打印出來。然後將其所有子項添加到隊列的後面(通常從左到右)。

當隊列爲空時,每個元素應該已經打印出來。

此外,有廣度的一個很好的解釋在維基百科上首先搜索:http://en.wikipedia.org/wiki/Breadth-first_search

42

廣度優先是隊列,深度優先是一個堆棧。

對於廣度優先,將所有孩子添加到隊列中,然後拉動頭部並使用相同的隊列對其進行廣度優先搜索。

對於深度優先,將所有孩子添加到堆棧,然後彈出並首先在該節點上使用相同的堆棧深度。

+5

和一個例子 - [這裏](http://edgblog.wordpress.com/2007/11/28/binary-tree-traversal/) – 2013-01-31 11:43:10

+1

[LaValle](http:/ /planning.cs.uiuc.edu/ch2.pdf),Sec.2.2提供了BFS,DFS以及其他搜索方法的完美統一處理。 – 2013-08-23 00:19:43

98

廣度優先搜索

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

爲什麼隊列在方法之外聲明?如果breadth()被同時調用兩次,這將失敗。我看不出任何將它作爲局部變量移動的缺點。 – Bryan 2014-05-12 21:27:19

+1

@Jonah在'breadth()'被調用兩次的情況下_concurrently_,只有一個隊列,所以它會添加兩次元素並且被兩次調用中的任何一次隨機拉動,更不用說LinkedList是不是線程安全的。 – Bryan 2016-10-12 09:28:36

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

,你已經寫了,不產生正確的BFS遍歷該代碼: (這是你要求的代碼是BFS,但實際上這是DFS!)

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

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

這是深度優先(預先遍歷)。 – Kreisquadratur 2015-09-21 19:29:17

+1

@Kreisquadratur,你讀過我的代碼上面的評論?我的意思是「你的代碼,我在下面複製的不是BFS」。沒有人提到過。但是這個代碼不是BFS,它是DFS。 (我更新了一點,以便更清楚) – Hengameh 2015-09-22 00:35:27

+1

我被許多「這個」弄糊塗了。 – Kreisquadratur 2015-09-22 10:26:31

-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

我不認爲你需要排隊在這裏。 – 2017-08-28 11:04:24

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); 
    } 
} 

和節點:

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; 
    } 
}