2011-03-10 16 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

+1

अच्छी तरह से मुझे यह पता लगाना प्रतीत नहीं होता कि मेरी पुस्तक में पहली बार चौड़ाई कैसे करें .... यह अभ्यास है ... होमवर्क नहीं। सही दिशा में इंगित करें ... –

+3

http://techieme.in/level-order-tree-traversal/ जो आप खोज रहे थे .. मुझे पता है कि यह बहुत देर हो चुकी है। बस इसे किसी ऐसे व्यक्ति के लिए डालें जिसकी अभी भी इसकी आवश्यकता है – dharam

उत्तर

9

ऐसा प्रतीत नहीं होता कि आप कार्यान्वयन के लिए पूछ रहे हैं, इसलिए मैं प्रक्रिया को समझाने की कोशिश करूंगा।

एक कतार का उपयोग करें। कतार में रूट नोड जोड़ें। कतार खाली होने तक लूप चलाएं। लूप के अंदर पहले तत्व को हटा दें और इसे प्रिंट करें। फिर अपने सभी बच्चों को कतार के पीछे (आमतौर पर बाएं से दाएं जा रहे हैं) में जोड़ें।

जब कतार खाली है तो प्रत्येक तत्व को मुद्रित किया जाना चाहिए था। गहराई पहले एक ढेर है http://en.wikipedia.org/wiki/Breadth-first_search

42

चौड़ाई पहले एक कतार है,:

इसके अलावा, वहाँ चौड़ाई का एक अच्छा विवरण पहले विकिपीडिया पर खोज है।

पहले चौड़ाई के लिए, सभी बच्चों को कतार में जोड़ें, फिर सिर खींचें और उसी कतार का उपयोग करके उस पर पहली बार एक चौड़ाई करें।

पहले गहराई के लिए, सभी बच्चों को ढेर में जोड़ें, फिर पॉप करें और उसी नोड पर पहले उस नोड पर गहराई करें।

+5

और एक उदाहरण - [यहां] (http://edgblog.wordpress.com/2007/11/28/binary-tree-traversal/) –

+1

[LaValle] (http://planning.cs.uiuc.edu/ch2.pdf), Sec.2.2 बीएफएस, डीएफएस, साथ ही साथ अन्य खोज विधियों का एक उत्कृष्ट एकीकृत उपचार प्रदान करता है। –

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

कतार विधि के बाहर क्यों घोषित किया गया है? यह असफल हो जाएगा अगर चौड़ाई() को दो बार समवर्ती रूप से बुलाया जाता है। मैं इसे स्थानीय चर के रूप में अंदर ले जाने के किसी भी नकारात्मक पक्ष को नहीं देख सकता। – Bryan

+1

@ जोनाह इस मामले में 'चौड़ाई()' को दो बार _concurrently_ कहा जाता है, केवल एक कतार है, इसलिए इसमें तत्वों को दो बार जोड़ा जाएगा और दो आविष्कारों में यादृच्छिक रूप से खींचा जाएगा, इस तथ्य का जिक्र नहीं कि 'लिंक्डलिस्ट' थ्रेड-सुरक्षित नहीं है। – 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

यह कोड जो आपने लिखा है, सही BFS ट्रेवर्सल उत्पादन नहीं कर रहा है: (यह कोड आप दावा किया BFS है, लेकिन वास्तव में है इस डीएफएस है!)

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

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

यह गहराई वाला पहला (प्री-ऑर्डर ट्रैवर्सल) है। – Kreisquadratur

+1

@ Kreisquadratur, क्या आपने कोड के ऊपर मेरी टिप्पणी पढ़ी? मेरा मतलब था "आपका कोड, जिसे मैंने नीचे कॉपी किया है वह बीएफएस नहीं है"। किसी ने इसका उल्लेख नहीं किया। लेकिन यह कोड बीएफएस नहीं है, यह डीएफएस है। (मैंने थोड़ा और स्पष्ट होने के लिए अद्यतन किया) – Hengameh

+1

मुझे कई "इस" से भ्रमित हो गया। – 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

मुझे नहीं लगता कि आपको यहां कतार की आवश्यकता है। –

1

चौड़ाई पहली खोज को लागू करने के लिए, आपको एक कतार का उपयोग करना चाहिए। आपको एक नोड के बच्चों को कतार में बाएं करना चाहिए (बाएं दाएं) और फिर नोड (प्रिंट डेटा) पर जाएं। फिर, आपको कतार से नोड को हटा देना चाहिए। कतार खाली होने तक आपको इस प्रक्रिया को जारी रखना चाहिए। https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java

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

और नोड:: आप BFS यहाँ की मेरी कार्यान्वयन देख सकते हैं

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; 
    } 
} 
संबंधित मुद्दे