Implementation of depth-first algorithm

Hi, I am trying to implement depth-first algorithm.(directed graph, no loops). Here what I have so far.
//form a one-element stack with the root node.
Stack st=new st();
boolean goalflg=false;
st.push(?)//do I need to clone the value from the tree, if yes, how can I do this? Should it be a Spanning Tree or not?
//repeat until the first path in the stack terminates at the goal node or the stack is empty
while(st.size()!=null || goalflg == true){  
/*-remove the first math from the Stack;create new paths by extending the first path to all neighbors of the terminal node * /
int temp=st.pop();
nodeRight=tree.goRight();// I aren't sure nodeLeft=tree.goLeft();
//reject all new paths with loops (how can I do this?)
//if the goal is found-success, else -failure     
if (temp==goalNode)     
{goalflg=true;}     
else{        //add the new paths to the front of stack      
st.push(nodeRight);
st.push(nodeLeft);     
Please,please help!
Sincerely,
Byryndyk
P.S. I check out google, but it has mostly the theory about this method. What I am interested is how to make it alive.

This algorithm for DFS has no constraints on edges as it works purely by inspecting adjacency lists; if a directed edge, e, goes from vertex u to vertex v, then v is adjacent to u, but u is not adjacent to v i.e. you can not travel this edge from v to u.
     public VertexModelInterface[] depthFirstSearch(VertexModelInterface from)
          visited.add(from);
          VertexModelInterface[] adjacencyList = (VertexModelInterface[]) from.getAdjacencyList().toArray(new VertexModelInterface[0]);
          for (int index = 0; index < adjacencyList.length; index++)
               if (!visited.contains(adjacencyList[index]))
                    depthFirstSearch(adjacencyList[index]);
               } // end if
          } // end for
          return (VertexModelInterface[]) visited.toArray(new VertexModelInterface[0]);
     } // end depthFirstSearch
visited is a list containing vertices. Each vertex has an adjacency list containing references to adjacent vertices.
Hope this helps anyone whos looking for a neat recursive (implicit stack) implementation. I also have implementations for BFS, Cut-Edge-Detection and Fleury's algorithm.
Kind regards,
Darren Bishop.
[email protected]

Similar Messages

  • Depth first search tree

    Hi,
    I have stored some states in a vector (States are numbers). In my code i have printed out the parent nodes, the 2 elements after the parent nodes are there child.
    The element placed at position 0 in the vector is the root. I do not know how to implement a depth first search tree to address unreachable node. In this case, parent node 5 is unreachable, from other nodes. But i do not know how to do this. I have spent ages reading tutorials/ book, but i cant seem to convert this knowledge into java. My code is very short and therefore easy to understand
    import java.awt.*;
    import java.util.*;
    public class Vec{
    public static void main(String argv[]){
        Vec v = new Vec();
        v.remove();
        }//End of main
    public void remove(){
            Vector mv = new Vector();
            //Note how a vector can store objects
            //of different types
            mv.addElement(1);  // root and parent node of 2 elements below
            mv.addElement(2);  // child of above
            mv.addElement(1);  // child of above
            mv.addElement(2);  // parent of 2 elements below
            mv.addElement(4);
            mv.addElement(2);
            mv.addElement(3); // parent of 2 elements below
            mv.addElement(1);
            mv.addElement(3);
            mv.addElement(4); // parent of 2 elements below
            mv.addElement(3);
            mv.addElement(4);
            mv.addElement(5);  // parent of 2 elements below
            mv.addElement(2);
            mv.addElement(4);
    // below identifys the parent nodes for you, but doesnt store them as parent nodes
                    for(int i=0; i< mv.size(); i++){
            if (i % 3 == 0)
                      System.out.println(mv.elementAt(i));
       }//End of amethod
            

    Ah ok, it's a graph and not a tree. In that case don't use the tree-code I posted, but model your graph as an adjacency matrix (AM) [1]. The AM for the graph you posted in reply #5 would look like this:
    Node | 1  2  3  4  5
    -----+--------------
       1 | 1  1  0  0  0
         |
       2 | 0  1  0  1  0
         |
       3 | 1  0  1  0  0
         |
       4 | 0  0  1  1  0
         |
       5 | 0  1  1  0  0You can implement this by using a simple 2D array of integers like this:class Graph {
        private int[][] adjacencyMatrix;
        public Graph(int numNodes) {
            adjacencyMatrix = new int[numNodes][numNodes];
        public void addEdge(int from, int to) {
            adjacencyMatrix[from-1][to-1] = 1;
        public boolean isReachable(Integer start, Integer goal) {
            // your algorithm here
            return false;
        public String toString() {
            StringBuilder strb = new StringBuilder();
            for(int i = 0; i < adjacencyMatrix.length; i++) {
                int[] row = adjacencyMatrix;
    strb.append((i+1)+" | ");
    for(int j = 0; j < row.length; j++) {
    strb.append(adjacencyMatrix[i][j]+" ");
    strb.append('\n');
    return strb.toString();
    public static void main(String[] args) {
    Graph graph = new Graph(5);
    graph.addEdge(1, 1);
    graph.addEdge(1, 2);
    graph.addEdge(2, 2);
    graph.addEdge(2, 4);
    graph.addEdge(3, 1);
    graph.addEdge(3, 3);
    graph.addEdge(4, 3);
    graph.addEdge(4, 4);
    graph.addEdge(5, 2);
    graph.addEdge(5, 3);
    System.out.println("Adjacency Matrix:\n"+graph);
    System.out.println("Is node 5 reachable from node 1? "+
    graph.isReachable(new Integer(1), new Integer(5))); // should be false
    System.out.println("Is node 1 reachable from node 5? "+
    graph.isReachable(new Integer(5), new Integer(1))); // should be true: a path exists from 5 -> 3 -> 1 and 5 -> 2 -> 4 -> 3 -> 1
    Good luck.
    [1]
    http://en.wikipedia.org/wiki/Adjacency_matrix
    http://mathworld.wolfram.com/AdjacencyMatrix.html

  • Depth First Search help

    I have an assignment to do on a graph and have to apply depth first search so it ouputs the vertices in a order. I understand the algorithm and can do it on paper but i cannot do it in code so if anyone can help me on this. Here are the classes i am working with
    public class MatrixGraph extends AbstractGraph {
        private double[][] matrix;
        public MatrixGraph(int nV, boolean direct, boolean weight ){
            super(nV, direct, weight);
            matrix = new double[nV][nV];
            // if a weighted graph set all values to Double.POSITIVE_INFINITY 
            // otherwise set all values to 0
            //complete this code
        public boolean isEdge(int source, int dest) {
            throw new UnsupportedOperationException("Not supported yet.");
        public void insert(Edge edge) {
            throw new UnsupportedOperationException("Not supported yet.");
        public void remove(Edge edge) {
            throw new UnsupportedOperationException("Not supported yet.");
        public void depthFirstTraversal(int start){
            //Output the vertices in depth first order
    public abstract class AbstractGraph implements Graph {
        private int numV;
        private boolean directed;
        private boolean weighted;
        public AbstractGraph(int nV, boolean direct, boolean weight){
            numV = nV;
            directed = direct;     
            weighted = weight;
        public int getNumV() {
            return numV;
        public boolean isDirected() {
            return directed;
        public boolean isWeighted() {
            return weighted;
    public interface Graph {
        //returns the number of vertices
        int getNumV();
        // determine if this is a directed graph
        boolean isDirected();
        // determine if this is a weighted graph
        boolean isWeighted();
        // determine if an edge exists between source and destination
        boolean isEdge(int source, int dest);
        void insert(Edge edge);
        void remove(Edge edge);
    }

    JavaLearner2009 wrote:
    public void depthFirstTraversal(int start){
    //Output the vertices in depth first order
    }I need help on this part i don't know how to write it.You mentioned you understand the algorithm and can do it on paper so what have you tried so far?
    If you are completely stuck on implementing the traversal in Java, provide pseudo code.
    Mel

  • Using depth first traversal to add a new node to a tree with labels

    Hello,
    I'm currently trying to work my way through Java and need some advice on using and traversing trees. I've written a basic JTree program, which allows the user to add and delete nodes. Each new node is labelled in a sequential order and not dependent upon where they are added to the tree.
    Basically, what is the best way to add and delete these new nodes with labels that reflect their position in the tree in a depth-first traversal?
    ie: the new node's label will correctly reflect its position in the tree and the other labels will change to reflect this addition of a new node.
    I've searched Google and can't seem to find any appropriate examples for this case.
    My current code is as follows,
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    public class BasicTreeAddDelete extends JFrame implements ActionListener
        private JTree tree;
        private DefaultTreeModel treeModel;
        private JButton addButton;
        private JButton deleteButton;
        private int newNodeSuffix = 1;
        public BasicTreeAddDelete() 
            setTitle("Basic Tree with Add and Delete Buttons");
            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Root");
            treeModel = new DefaultTreeModel(rootNode);
            tree = new JTree(treeModel);
            JScrollPane scrollPane = new JScrollPane(tree);
            getContentPane().add(scrollPane, BorderLayout.CENTER);
            JPanel panel = new JPanel();
            addButton = new JButton("Add Node");
            addButton.addActionListener(this);
            panel.add(addButton);
            getContentPane().add(panel, BorderLayout.SOUTH);
            deleteButton = new JButton("Delete Node");
            deleteButton.addActionListener(this);
            panel.add(deleteButton);
            getContentPane().add(panel, BorderLayout.SOUTH);    
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(400, 300);
            setVisible(true);
        public void actionPerformed(ActionEvent event) 
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
            if(event.getSource().equals(addButton))
                if (selectedNode != null)
                    // add the new node as a child of a selected node at the end
                    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New Node" + newNodeSuffix++);
                      treeModel.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
                      //make the node visible by scrolling to it
                    TreeNode[] totalNodes = treeModel.getPathToRoot(newNode);
                    TreePath path = new TreePath(totalNodes);
                    tree.scrollPathToVisible(path);               
            else if(event.getSource().equals(deleteButton))
                //remove the selected node, except the parent node
                removeSelectedNode();           
        public void removeSelectedNode()
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
            if (selectedNode != null)
                //get the parent of the selected node
                MutableTreeNode parent = (MutableTreeNode)(selectedNode.getParent());
                // if the parent is not null
                if (parent != null)
                    //remove the node from the parent
                    treeModel.removeNodeFromParent(selectedNode);
        public static void main(String[] arg) 
            BasicTreeAddDelete basicTree = new BasicTreeAddDelete();
    }      Thank you for any help.

    > Has anybody got any advice, help or know of any
    examples for this sort of problem.
    Thank you.
    Check this site: http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html

  • 8-Puzzle Depth First Search .. Need Help

    Hi, I have the following code for doing a depth first search on the 8-Puzzle problem
    The puzzle is stored as an object that contains an array such that the puzzle
    1--2--3
    4--5--6
    7--8--[] is stored as (1,2,3,4,5,6,7,8,0)
    The class for the puzzle is:
    class Puzzle implements {
         Puzzle parent;
         int[] pzle;
         int blank;
         Puzzle(int p1,int p2,int p3,int p4,int p5, int p6, int p7, int p8, int p9){
              pzle = new int[9];
              pzle[0] = p1; if(p1==0){ blank=0;}
              pzle[1] = p2; if(p2==0){ blank=1;}
              pzle[2] = p3; if(p3==0){ blank=2;}
              pzle[3] = p4; if(p4==0){ blank=3;}
              pzle[4] = p5; if(p5==0){ blank=4;}
              pzle[5] = p6; if(p6==0){ blank=5;}
              pzle[6] = p7; if(p7==0){ blank=6;}
              pzle[7] = p8; if(p8==0){ blank=7;}
              pzle[8] = p9; if(p9==0){ blank=8;}
         public Puzzle() {
         public boolean equals(Puzzle p){
              if(p == null) return false;
              for(int i =0;i<9;i++){
                   if(p.pzle!=pzle[i]){
                        return false;
              return true;
         public String toString(){
              return pzle[0] + "\t" + pzle[1] + "\t" + pzle [2] + "\n" +
                        pzle[3] + "\t" + pzle[4] + "\t" + pzle [5] + "\n" +
                        pzle[6] + "\t" + pzle[7] + "\t" + pzle [8] + "\n";
         public String printSolution(){
              String ret ="";
              Puzzle st = parent;
              while(st!=null){
                   ret = st + "\n=======================\n" + ret;
                   st = st.parent;
              ret=ret+this;
              return ret;
         public ArrayList<Puzzle> successors(){
              ArrayList<Puzzle> succ = new ArrayList<Puzzle>();
              int b = blank;
              if (((b-1) % 3) != 2 && b!=0) {
              Puzzle np1 = new Puzzle();
              np1.parent = this;
              np1.pzle = new int[9];
              for(int i =0;i<9;i++){
                   np1.pzle[i] = pzle[i];
              np1.pzle[b] = np1.pzle[b-1]; np1.pzle[b-1] = 0;
              np1.blank = b-1;
              if(!np1.equals(this.parent)){
              succ.add(np1);
              if (((b+1) % 3) != 0) {
              Puzzle np2 = new Puzzle();
              np2.parent = this;
              np2.pzle = new int[9];
              for(int i =0;i<9;i++){
                   np2.pzle[i] = pzle[i];
              np2.pzle[b] = np2.pzle[b+1]; np2.pzle[b+1] = 0;
              np2.blank = b+1;
              if(!np2.equals(this.parent)){
                   succ.add(np2);
              if (b-3 >= 0) {
              Puzzle np3 = new Puzzle();
              np3.parent = this;
              np3.pzle = new int[9];
              for(int i =0;i<9;i++){
                   np3.pzle[i] = pzle[i];
              np3.pzle[b] = np3.pzle[b-3]; np3.pzle[b-3] = 0;
              np3.blank = b-3;
              if(!np3.equals(this.parent)){
                   succ.add(np3);
              if (b+3 < 9) {
              Puzzle np4 = new Puzzle();
              np4.parent = this;
              np4.pzle = new int[9];
              for(int i =0;i<9;i++){
                   np4.pzle[i] = pzle[i];
              np4.pzle[b] = np4.pzle[b+3]; np4.pzle[b+3] = 0;
              np4.blank = b+3;
              if(!np4.equals(this.parent)){
                   succ.add(np4);
              return succ;
         The code for the DFS is      public static boolean DFS(Puzzle p, Puzzle goal, ArrayList<Puzzle> closed){
         if(p.equals(goal)){
              sol=p;
              return true;
         for(Puzzle pz : closed){
                   if(pz.equals(p)){
                        return false;
         closed.add(p);
                        //Generate all possible puzzles that can be attained
                        ArrayList<Puzzle> succ = p.successors();
                        for(Puzzle puz : succ){
                             if(DFS(puz,goal,closed)){ return true;}
              return false;
    }The problem is that when i run this on say the following start and goal:          Puzzle startP = new Puzzle(5,4,0,6,1,8,7,3,2);
              Puzzle goalP =new Puzzle(1,2,3,8,0,4,7,6,5);
              ArrayList<Puzzle> closed = new ArrayList<Puzzle>();
              startP.parent=null;
              boolean t = DFS(startP,goalP,closed);5-4-0
    6-1-8
    7-3-2 
    start and goal
    1-2-3
    8-0-4
    7-6-5
    it first takes foreever which is expected but it There should be 9! possible states correct? If I print out the size of the closed array (already seen states) it gets up to about 180000 and then returns with no solution found. But this is well under the 9! possible states...
    Its hard to know whats wrong and if it is even wrong.. but could someone please look at my code and see if something is off?
    I dont think the successor generator is wrong as I tested the blank in every space and it got the correct successors.
    Any ideas?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    Puzzle(int p1,int p2,int p3,int p4,int p5, int p6, int p7, int p8, int p9){
              pzle = new int[9];
              pzle[0] = p1; if(p1==0){ blank=0;}
              pzle[1] = p2; if(p2==0){ blank=1;}
              pzle[2] = p3; if(p3==0){ blank=2;}
              pzle[3] = p4; if(p4==0){ blank=3;}
              pzle[4] = p5; if(p5==0){ blank=4;}
              pzle[5] = p6; if(p6==0){ blank=5;}
              pzle[6] = p7; if(p7==0){ blank=6;}
              pzle[7] = p8; if(p8==0){ blank=7;}
              pzle[8] = p9; if(p9==0){ blank=8;}
         }vs
    Puzzle(int...puzzle) {
      assert puzzle.length == 9;
      this.puzzle = Arrays.copyOf(puzzle, 9);
      for (int blank = 0; blank < 9; ++blank) if (puzzle[blank] == 0) break;
      // check values are 0...8
      Arrays.sort(puzzle); // sorts the original
      for (int i = 0; i < 9; ++i) assert puzzle[i] == i;
    Does anyone know if there are any simple applets or programs that do 8 Puzzle on any given start and finish state? Just to see the expected results.Not off hand, but you can always generate your starting state by moving backwards from the finish state.
    Also, I dont know..but are there some instances of an 8 Puzzle that cannot be solved at all?? IIRC, you can't transform 123 to 132 leaving the remainder unchanged, though I haven't checked.

  • SAP implementation for the first time

    Hi,
    I'm still new to SAP and need to know a few things...
    Could someone help me with the answers of the following questions?
    1) What happens when a company goes through an SAP implementation for the first time.
    2) how the company goes into project mode to achieve success when implementing SAP.
    3) Project Members and what they do:
    Basis Analyst,
    Project Mgr,
    Security Analyst,
    Functional Analysts,
    Integration Manger,
    Technical Manager,
    ABAPers,
    etc.
    4) how the business gets involved to help project members get the help they need to implement SAP.
    Regards,
    Ashod

    Yergat wrote:
    Hi,
    > 1) What happens when a company goes through an SAP implementation for the first time.
    >
    SAP gets implemented
    > 2) how the company goes into project mode to achieve success when implementing SAP.
    Project mode is a state of anarchy between start and End, and being in the state for the longest period woud guarantee success....once you started, there should never be a end
    > 3) Project Members and what they do:
    > Basis Analyst,
    Analyses basic stuff
    > Project Mgr,
    He wrongly projects and manages filthily
    > etc.
    These are the most important ones, so always have them on board
    > 4) how the business gets involved to help project members get the help they need to implement SAP.
    > Regards,
    > Ashod
    When someone kicks on the back-side and we realize that we need to get onto Project mode - make no mistake my firend, it is the Business guys. the project guys need not worry, they will get this help for free

  • Depth First Search w/o Recursion

    I am trying to use Depth First Search for 2-D maze, and I was just wondering if there was a straight forward and easy way of doing DFS of a maze without using recursion. Or is recursion the really only way you do DFS without invoking a lot of messy variables to hold temporary information.

    itereation instead of recursion...can you be a little more discriptive.
    For recursion I can understand how it works because when you pop out of one recursive cycle you got to the next command. So basically
    move{
    if you can
    go left
    move()
    go right
    move()
    go up
    move()
    go down
    move()
    else
    pop out of recursion
    hopefully this pseudocode makes some sense. But absically lets say with my maze I go right 3 times then can't go right anymore...well when that happens it will try to go right, because after calling move() under "go left" the next step would just be to go left. But I don't see how this can be done iteratively. If somebody can explain it pseudocode that would be cool too.

  • Depth first in hierarchical query

    Does anybody know how to make a depth first run through of a
    hierarchical query using START WITH ... CONNECT BY PRIOR???

    Allright, here comes the details:
    Imagine that you need to perform a depth first run of a table
    that looks like this:
    id
    parent_id
    priority
    depth
    attribute1
    attribute2
    id is primary key and parent_id foreign key to id, i.e. it
    references id. The priority is forth numbered from 1 to n if n
    children are attached to the same parent. The depth indicates
    the depth in the tree the row is. Example rows:
    1 null 1 0 foo bar ...
    2 1 2 1 foobar barfoo ...
    3 1 1 1 barbar foofoo ...
    4 null 2 0 foo bar ...
    5 2 1 2 foofoobar barfoofoo ...
    6 2 3 2 foobarfoo barfoobar ...
    7 2 2 2 foofoofoo barbarbar ...
    8 6 1 3 foooooooooo baaaaaaaaar ...
    9 1 3 1 fooooo baaaar ...
    The desired result should then be (assume that all attributes
    are selected):
    1 null 1 0 foo bar ...
    3 1 1 1 barbar foofoo ...
    2 1 2 1 foobar barfoo ...
    5 2 1 2 foofoobar barfoofoo ...
    7 2 2 2 foofoofoo barbarbar ...
    6 2 3 2 foobarfoo barfoobar ...
    8 6 1 3 foooooooooo baaaaaaaaar ...
    9 1 3 1 fooooo baaaar ...
    4 null 2 0 foo bar ...
    My attempt was to try something like:
    SELECT id, parent_id, priority, attribute1, attribute2, ...
    FROM table
    CONNECT BY PRIOR id = parent_id START WITH id = ?
    ORDER BY depth, priority
    I know that the depth can be obtained from CONNECT BY PRIOR, but
    I use the depth in other SQLs, so just assumes that you have
    it...
    This SELECT ofcause only selects from a given id and down, but
    that is also ok; we can just start with id = 1. And the SELECT
    needs to be given the root id, since that is the way the
    application works...
    But this does not work, since it groups by depth thus return all
    children (c1...cN) at depth i for parent_id x before the
    children of a child in (c1...cN) at depth i+1.
    So, I guess the question is... If the above SELECT can be used
    showhow, then
    SELECT id, parent_id, priority, attribute1, attribute2, ...
    FROM table
    CONNECT BY PRIOR id = parent_id START WITH id = ?
    ORDER BY __WHAT_GOES_HERE___, priority
    or if not, please state a SELECT statement that does the trick!
    Regards
    Sxren

  • When to go for Breadth first search over depth first search

    hi,
    under which scenarios breadth first search could be used and under which scenarios depth first search could be used?
    what is the difference between these two searches?
    Regards,
    Ajay.

    No real clear-cut rule for when to use one over the other. It depends on the nature of your search and where you would prefer to find results.
    The difference is that in breadth-first you first search all immidiate neighbours before searching their neighbours (sort of like preorder traversal). Whereas in depth-first you search some random (or otherwise selected) neighbour and then a neighbour of that node until you can't go deeper (i.e., you've searched a neighbour that has no other neighbours). This probably isn't a very clear explanation, perhaps you'll find this more helpful: http://www.ics.uci.edu/~eppstein/161/960215.html
    If you would prefer to find results closer to the origin node, breadth first would be better. If you would prefer to find results further away use depth first.

  • Depth first, pre-order traversal ?

    Im experiementing with various examples of parsing an XML document and adapting it to a TreeModel for use in a JTree component. Im looking at some of the newer JAXP API's like org.w3c.dom.traversal
    Interface DocumentTraversal. Im wondering about depth first and pre-order traversal.
    What do these terms mean ? Im guessing it has to do with the tree type data structure ? Like many programmers out there, I went to college for something other than comp sci so i never had the unfortunate pleasure of taking a data structures course.
    Also it seems like the level 2 DOM spec is making things alot easier to work with, but even Sun doesnt have a good tutorial on using the newer API's.

    Pre-order traversal simply means, that any method is applied to the parent first, before it is applied to its children. A tree like
    aNode
    -pNode-+-bNode
    cNode
    would therefor result in a series of method calls like:
    pNode.yourMethod();
    aNode.yourMethod();
    bNode.yourMethod();
    cNode.yourMethod();
    Whereas post-order taversal would start with the children and process the parent node as last one. Finally a in-order run would process some children first, which come in some kind of order before the parent node, then the root node and finally the remaining children. Of course, that makes only sense if the tree is ordered in some way, eg. if the node content can be ordered alphabetically or so.
    Hope that helps,
    Mathias

  • Depth-First sort of organisational hierarchy

    Hi,
    we need to perform a depth-first sort of the organisational hierarchy in order to sort some output (remuneration statements).
    Is there any standard functionality for getting a depth-first on organisational hierarchy?
    Is there any good function modules that could help, in stead of going straight for the relelation table for all organizational units.
    Thank you for your help

    Hello Michael
    May be you can use the FM "RH_STRUC_GET" with different evalaution paths which is suitable to you. You can check the evaluation paths in tcode OOAW, if you need one you can build one as per your req. And you can use with the FM mentioned before.
    Regards
    Ranganath

  • Depth first search and breadth first search

    can anyone help for this program. can anyone give me a program for this without using an applet.
    thanks!!!

    can anyone help for this program. can anyone give me a
    program for this without using an applet.
    thanks!!!What are you talking about? What program? Depth-first means you recursively search from root to the first leaf, then go up one level, go down as far as you can, repeat. Breadth-first means you search every node on each level before going on to the next level.

  • Depth First Search, Breadth First Search

    BANNER
    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod
    PL/SQL Release 10.2.0.5.0 - Production
    CORE     10.2.0.5.0     Production
    TNS for Linux: Version 10.2.0.5.0 - Production
    NLSRTL Version 10.2.0.5.0 - Production
    I
    have this table that form a tree where record with column value 'more_left' 0 is located more left than 1 (for example, record with id 2 has a parent id 1 and more left than record with id 7 that also has parent id 1):
    with t as(
      select 2 id,1 parent_id,0 most_left from dual
      union all
      select 7 id,1 parent_id,1 most_left from dual
      union all
      select 8 id,1 parent_id,2 most_left from dual
      union all
      select 3 id,2 parent_id,0 most_left from dual
      union all
      select 6 id,2 parent_id,1 most_left from dual
      union all
      select 9 id,8 parent_id,0 most_left from dual
      union all
      select 12 id,8 parent_id,1 most_left from dual
    union all
      select 4 id,3 parent_id,0 most_left from dual
      union all
      select 5 id,3 parent_id,1 most_left from dual
    union all
      select 10 id,9 parent_id,0  most_left from dual
      union all
      select 11 id,9 parent_id,1 most_left from dual
    select * from t;The problem is to show all the ids, using Breadth First Search and Depth First Search. Tx, in advance.
    Edited by: Red Penyon on Apr 12, 2012 3:39 AM

    Hi,
    I fail to understand how comes there is no row for ID=1 ?
    The topmost parent (the root) should be in the table also.
    For 11g, this would work (as long as the root is in the table) :Scott@my11g SQL>l
      1  WITH t AS
      2       (SELECT 1 ID, 0 parent_id, 0 most_left
      3          FROM DUAL
      4        UNION ALL
      5        SELECT 2 ID, 1 parent_id, 0 most_left
      6          FROM DUAL
      7        UNION ALL
      8        SELECT 7 ID, 1 parent_id, 1 most_left
      9          FROM DUAL
    10        UNION ALL
    11        SELECT 8 ID, 1 parent_id, 2 most_left
    12          FROM DUAL
    13        UNION ALL
    14        SELECT 3 ID, 2 parent_id, 0 most_left
    15          FROM DUAL
    16        UNION ALL
    17        SELECT 6 ID, 2 parent_id, 1 most_left
    18          FROM DUAL
    19        UNION ALL
    20        SELECT 9 ID, 8 parent_id, 0 most_left
    21          FROM DUAL
    22        UNION ALL
    23        SELECT 12 ID, 8 parent_id, 1 most_left
    24          FROM DUAL
    25        UNION ALL
    26        SELECT 4 ID, 3 parent_id, 0 most_left
    27          FROM DUAL
    28        UNION ALL
    29        SELECT 5 ID, 3 parent_id, 1 most_left
    30          FROM DUAL
    31        UNION ALL
    32        SELECT 10 ID, 9 parent_id, 0 most_left
    33          FROM DUAL
    34        UNION ALL
    35        SELECT 11 ID, 9 parent_id, 1 most_left
    36          FROM DUAL
    37  )
    38  select
    39  rt
    40  ,listagg(id,'-') within group (order by lvl,id) BFS
    41  ,listagg(id,'-') within group (order by pth,lvl) DFS
    42  from (
    43  SELECT id, connect_by_root(id) rt, sys_connect_by_path(most_left,'-') pth, level lvl, most_left
    44        FROM  t
    45  CONNECT by nocycle  prior ID = parent_id
    46  START WITH parent_id = 0
    47  )
    48* group by rt
    Scott@my11g SQL>/
            RT BFS                            DFS
             1 1-2-7-8-3-6-9-12-4-5-10-11     1-2-3-4-5-6-7-8-9-10-11-12But as long as you're 10g, that is no real help.
    I'll try to think of a way to get that with 10g.
    10g solution for DFS :Scott@my10g SQL>l
      1  WITH t AS
      2  (
      3       SELECT 1 ID, 0 parent_id, 0 most_left FROM DUAL UNION ALL
      4       SELECT 2 ID, 1 parent_id, 0 most_left FROM DUAL UNION ALL
      5       SELECT 7 ID, 1 parent_id, 1 most_left FROM DUAL UNION ALL
      6       SELECT 8 ID, 1 parent_id, 2 most_left FROM DUAL UNION ALL
      7       SELECT 3 ID, 2 parent_id, 0 most_left FROM DUAL UNION ALL
      8       SELECT 6 ID, 2 parent_id, 1 most_left FROM DUAL UNION ALL
      9       SELECT 9 ID, 8 parent_id, 0 most_left FROM DUAL UNION ALL
    10       SELECT 12 ID, 8 parent_id, 1 most_left FROM DUAL UNION ALL
    11       SELECT 4 ID, 3 parent_id, 0 most_left FROM DUAL UNION ALL
    12       SELECT 5 ID, 3 parent_id, 1 most_left FROM DUAL UNION ALL
    13       SELECT 10 ID, 9 parent_id, 0 most_left FROM DUAL UNION ALL
    14       SELECT 11 ID, 9 parent_id, 1 most_left FROM DUAL
    15  )
    16  select max(pth) DFS
    17  from (
    18  select sys_connect_by_path(id,'-') pth
    19  from (
    20  select id,pth,lvl,most_left, row_number() over (order by pth, lvl) rn
    21  from (
    22  select id, sys_connect_by_path(most_left,'-') pth, level lvl, most_left
    23  from t
    24  CONNECT by nocycle  prior ID = parent_id
    25  START WITH parent_id = 0
    26  )
    27  order by pth, lvl
    28  )
    29  connect by prior rn= rn-1
    30  start with rn=1
    31* )
    Scott@my10g SQL>/
    DFS
    -1-2-3-4-5-6-7-8-9-10-11-12------
    10g solution for BFS :Scott@my10g SQL>l
      1  WITH t AS
      2  (
      3       SELECT 1 ID, 0 parent_id, 0 most_left FROM DUAL UNION ALL
      4       SELECT 2 ID, 1 parent_id, 0 most_left FROM DUAL UNION ALL
      5       SELECT 7 ID, 1 parent_id, 1 most_left FROM DUAL UNION ALL
      6       SELECT 8 ID, 1 parent_id, 2 most_left FROM DUAL UNION ALL
      7       SELECT 3 ID, 2 parent_id, 0 most_left FROM DUAL UNION ALL
      8       SELECT 6 ID, 2 parent_id, 1 most_left FROM DUAL UNION ALL
      9       SELECT 9 ID, 8 parent_id, 0 most_left FROM DUAL UNION ALL
    10       SELECT 12 ID, 8 parent_id, 1 most_left FROM DUAL UNION ALL
    11       SELECT 4 ID, 3 parent_id, 0 most_left FROM DUAL UNION ALL
    12       SELECT 5 ID, 3 parent_id, 1 most_left FROM DUAL UNION ALL
    13       SELECT 10 ID, 9 parent_id, 0 most_left FROM DUAL UNION ALL
    14       SELECT 11 ID, 9 parent_id, 1 most_left FROM DUAL
    15  )
    16  select max(pth) BFS
    17  from (
    18  select sys_connect_by_path(id,'-') pth
    19  from (
    20  select id,pth,lvl,most_left, row_number() over (order by lvl, pth) rn
    21  from (
    22  select id, sys_connect_by_path(most_left,'-') pth, level lvl, most_left
    23  from t
    24  CONNECT by nocycle  prior ID = parent_id
    25  START WITH parent_id = 0
    26  )
    27  order by lvl, pth
    28  )
    29  connect by prior rn= rn-1
    30  start with rn=1
    31* )
    Scott@my10g SQL>/
    BFS
    -1-2-7-8-3-6-9-12-4-5-10-11There might certainly have better ways...

  • Is SQR #include a depth first search or breadth first search alrgorithm

    Just wondering if SQR compiler is a dfs or bfs algorithm? I am guessing a dfs since includes can show up at the beginning or end of the sqr or sqc definition but position is relevant. So a few questions that branch off of that one.
    I have successfully included file filea.sqc and fileb.sqc in myfile.sqr, then included file subfile.sqc in both filea.sqc and fileb.sqc. There seemed to be no error message, so I am wondering how the file include works. I would think from a compiler point of view, if we included the same procedure or function twice, we should do one of three things - ignore the second instance (do nothing), override the first instance, or throw an error.
    So, anyone know how the compiler stack is built?

    The documentation doesn't help much, but if you want to prevent an include from being loaded more than once, you should be able to use a combination of compiler directives, i.e. #IFNDEF and #DEFINE.
    In your example, if you code subfile.sqc like
    #IFNDEF SUBFILE_INCLUDED
    #DEFINE SUBFILE_INCLUDED Y
    begin-procedure subfile_proc
    #ENDIFthen you should only get one copy of the code between the #IFNDEF-#ENDIF statements.
    You could probably use something similar to test how SQR handles multiple includes of the same file. Try something like
    #IFDEF SUBFILE_INCLUDED
    Display 'Subfile included twice'
    #ENDIF
    #IFNDEF SUBFILE_INCLUDED
    #DEFINE SUBFILE_INCLUDED Y
    #ENDIFand see if the message is displayed.
    Regards,
    Bob

  • Help implementing a simple minimax algorithm

    Okay Im making a minimax algorithm for Tic Tac Toe to try to learn some basics of it but I hit a wall
    protected int winValue(int indexOne, int indexTwo)
        int[][] tempBoard = new int[3][3];
        int winValue;
        for(int i = 0; i < 3 ; i++)
          for(int b = 0; b < 3; b++)
            tempBoard[i] = ticTacToeBoard;
    if(Player == false)
    {tempBoard[indexOne][indexTwo] = 1;}
    else if(Player == true)
    {tempBoard[indexOne][indexTwo] = 2;}
    for(int i = 0; i < 8; i++)
    int one = tempBoard[winGameChecks[i][0][0]][winGameChecks[i][0][1]];
    int two = tempBoard[winGameChecks[i][1][0]][winGameChecks[i][1][1]];
    int three = tempBoard[winGameChecks[i][2][0]][winGameChecks[i][2][1]];
    if(one != 0 && one == two && three == two)
    Win = true;
    if(Win == true)
    winValue = -1;
    Win = false;
    else if(block(indexOne,indexTwo) == 0)
    winValue = 0;
    else
    winValue = 1;
    return winValue;
    Okay
    win game checks is basically all the possible wins for victory in tic tac toe
    protected int[][][] winGameChecks =
            { {0,0},{0,1},{0,2} },
            { {0,0},{1,0},{2,0} },
            { {0,0},{1,1},{2,2} },
            { {0,1},{1,1},{2,1} },
            { {0,2},{1,2},{2,2} },
            { {1,0},{1,1},{1,2} },
            { {2,0},{2,1},{2,2} },
            { {2,0},{1,1},{0,2} }
      };TictacToeboard is the actual board from rows 0-2 and colums 0-2
    indexOne is the row
    indexTwo is the colum
    This code is to determine the win value of each move, -1 for a win, 0 for a draw or block and 1 for a random move
    in my head this seemed to work, but whenever I call the method, it always returns 1
    and the method block is this
    protected int block(int indexOne, int indexTwo)     //to determine the win value if blocking
      {                         //return 0 if the move is a block, -1 if block failed
        for(int i = 0; i < 8; i++)
          int one = ticTacToeBoard[winGameChecks[0][0]][winGameChecks[i][0][1]];
    int two = ticTacToeBoard[winGameChecks[i][1][0]][winGameChecks[i][1][1]];
    int three = ticTacToeBoard[winGameChecks[i][2][0]][winGameChecks[i][2][1]];
    if(indexOne == three)
    if(one != 0 && one == two && three == 0)
    {return 0;}
    else if(indexOne == one)
    if(one != 0 && three == two && one == 0)
    {return 0;}
    else if(indexOne == two)
    if(one != 0 && one == three && two == 0)
    {return 0;}
    return -1;
    if anyone wants to read this through and help me I'd appreciate it

    helped a little but now when I try to return the right node with the lowest value, it always gives a random move...
    protected void minMoves()
              int winValue;
              ArrayList bestMoves = new ArrayList(0);  //TreeNode of arrays of best moves
              TreeNode temp;
              int row;
              int col;
              for(int i = 0; i < 3; i++)    //makes children with moves remaining
                   for(int b = 0; b < 3; b++)
                        if(movesLeft[0] != -1 && movesLeft[0] != -1)
                        row = movesLeft[0];
                        col = movesLeft[1];
                        winValue = winValue(row, col);
                        TreeNode add = new TreeNode(row,col,winValue);
                        computer.addNode(add);
    for(int i = 0; i < computer.getLength(); i++)//used for debuggin
    temp = new TreeNode((TreeNode)computer);
    System.out.println("Cord" + computer.getIndex(i).getRow() + " " + temp.getIndex(i).getCol());
              for(int i = 0; i < computer.getLength(); i++) //go through all the children nodes
              if(computer.getIndex(i).winValue() == -1)
              temp = computer.getIndex(i);
              bestMoves.add(temp);
              else if (computer.getIndex(i).winValue() == 0 && bestMoves.size() == 0)
              temp = computer.getIndex(i);
              bestMoves.add(temp);
              else if (computer.getIndex(i).winValue() == 1 && bestMoves.size() == 0)
              temp = computer.getIndex(i);
              bestMoves.add(temp);
              for(int i = 0; i < bestMoves.size(); i++)
              temp = new TreeNode((TreeNode)bestMoves.get(i));
              System.out.println("Cord" + temp.getRow() + " " + temp.getCol());
              //Now I have an arraylist of the best moves possible
              //Now to pick a random of the best moves.
              Random ranGen = new Random();
              int random = ranGen.nextInt(bestMoves.size());
              temp = new TreeNode((TreeNode)bestMoves.get(random));
              row = temp.getRow();
              col = temp.getCol();
              ticTacToeBoard[row][col] = 2;
              computer = new TreeNode(row, col, winValue(row, col));
              removeUsedMove(row, col);
              OutputBoard();
              //Next Players Turn
              Player = false;
    Help please, my head is hurting over this

Maybe you are looking for

  • Vendor duplicate payment-Report

    Dear Guru    I have an requirement to develop a report that can tell about vendor duplicate payment considering Partial payment and residual payment and full payment.Is there any standard report available ? O r I have to develop a new Custom report.I

  • Error in loading Master Data

    Hi All, i have an error in loading master and i want to know please how can i individuate the data that need to be corrected, i have loaded data in psa and when i click on simulate/cancel update i find an error in data package 19 and data record 6701

  • I have a Skype account for my work but want to hav...

    It kept asking me "Request permission from Skype manager" which is my work account. I do have a personal email that I could use but couldn't find any link to starting a new private personal Skype account - help!! Skype site isn't very user friendly i

  • Huge percentage of files "missing"

    yeah, we all are having out iTunes 11 crises, here's mine a huge percentage of my files (I'm going to guess 40% or so) are now showing up as missing. Once I click on the file and select the resulting Locate option I can type the title of the song and

  • Wizard bug - conditional validation

    Hello, We require validation on a wizard to prevent the user from navigating from a particular page to the next page unless they have checked a checkbox. The underlying column is not mandatory because the user may not have to visit this particular pa