Recursive version of preorder traversal???

Can some one please give me a sample code of what recursive version of preorder traversal should look like???
thank you :)

JavaLearner2009 wrote:
Can some one please give me a sample code of what recursive version of preorder traversal should look like???Could you please do your own homework?
Could you please limit the amount of punctuation characters to one at each appropriate location?
Could you please learn [How To Ask Questions The Smart Way|http://www.catb.org/~esr/faqs/smart-questions.html]?
Could you please ask a specific question about a concrete problem that you find while doing your own homework?
thank you :)thank you :)

Similar Messages

  • Non recursive preorder traversal of binary tree

    hi,
    I am trying to implement a non-recursive traversal of binary tree. I already know the recursive one.
    I am trying to do it by using a Stack.
    I begin by Pushing the root of an element on to a stack, and then run a while loop in which i pop an element of the stack and get its children from right to left. and push it in the same order on to the stack. So during the next iteration of my while loop the top most element gets popped and its children and pushed on to the stack in the above manner.
    but when i pop an element from a stack its popped as an object so i dont know how to access its children.
    help me i am really stuck.

    Hi, I suppose you have something like this :
    class Stack {
      public void push( Object object ) throws ... { ... }
      public Object pop() throws ... { ... }
    class Element {
      Element elem;
      stack.push(elem);
      /* because pop() method return an object of type Object
      ** if you are sure that your stack only contains Element object
      ** then you need to cast (change the type of) what the pop() method
      ** returns in this way :
      elem = (Element)stack.pop();
      ...further reading on casting will be a good idea anyway.

  • Recursion and memory

    I have a program that generates XML. We noticed that it was using an extrodinary amount of memory. Thinking that the problem involved clobs I started researching the code. As I was benchmarking items I noticed that the problem did not seem to lie in the clobs i was creating but the recursion I was performing. Below I have two procedures. They both create X number of clobs and append their results to a main clob. I ran both for 10,000 iterations and recorded the results. The recursive version took longer(pretty much as i suspected) and took almost 5x the memory(way more than I could ever expect). Is there any thing that can be done to decrease the memory overhead involved with recursion. The program I was benchmarking for traverses a tree structure and the trees can sometimes be very large. Recursion keeps the code very flexible and much easier to read(once you get past the recursion part, as it can be confusing at times). In one case the memory that the oracle service was using jumped from 147mb to 1.4gb. This is not even remotely acceptable and I really want to find a solution other than rewriting the core of the tree traversing logic.
    Below is the sample code for my benchmarking and the results
    CREATE OR REPLACE PROCEDURE make_clobs(v_num_clobs IN NUMBER)
    IS
    TYPE t_clob_ar IS TABLE OF CLOB INDEX BY BINARY_INTEGER;
    v_arr t_clob_ar;
    v_main CLOB;
    BEGIN
    FOR i IN 1..v_num_clobs LOOP
    v_arr(i) :='123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789-'||chr(13);
    v_main := v_main||v_arr(i);
    END LOOP;
    dbms_output.put_line(dbms_lob.getlength(v_main));
    END;
    create or replace PROCEDURE recursion(p_start IN NUMBER, p_limit IN NUMBER, p_clob IN OUT CLOB)
    is
    begin
    p_clob := p_clob||'123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789-'||chr(13);
    IF(p_start <= p_limit)THEN
    recursion(p_start + 1, p_limit, p_clob);
    END IF;
    end recursion;
    RESULTS:
    10,000 iterations
    ~80 character clobs(per iteration)
    program start mem end mem total mem time total clob len
    make_clobs(for loop) 103,740 112,684 8,944 445.781s 810000
    recursion 103,532 147,284 43,752 1037.469s 810081

    Based off what was said earlier I recreated the recursion function inside a package and used a package spec globally defined clob. I removed the clob from the parameter list. I ran it for 4000 iterations and got the same results as a 4000 iteration on the original recursion procedure.
    Below is the code from both recursion procedures. They both reside in the same package. in the package spec the clob pv_clob is declared
    recursion_int_clob uses the internal clob and recursion_clob uses the parameter
    PROCEDURE recursion_int_clob(p_start IN NUMBER, p_limit IN NUMBER)
    is
    begin
    pv_clob := pv_clob||'123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789-'||chr(13);
    IF(p_start <= p_limit)THEN
    recursion_int_clob(p_start + 1, p_limit);
    END IF;
    end recursion_int_clob;
    PROCEDURE recursion_clob(p_start IN NUMBER, p_limit IN NUMBER, p_clob IN OUT NOCOPY CLOB)
    is
    begin
    p_clob := p_clob||'123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789-'||chr(13);
    IF(p_start <= p_limit)THEN
    recursion_clob(p_start + 1, p_limit, p_clob);
    END IF;
    end recursion_clob;
    4,000 iteration results
    program total mem usage time
    recursion_in_clob 17352 166.375s
    recursion_clob 17788 104.922s
    any ideas on why this might be?

  • Breadth First Traversal of a Tree...

    Hi,
    I want to make a program to print every node of a tree in a Breadth First Search (BFS)/Traversal. Since, BFS searches a tree in levels (i.e. 1st the root, then it's Children, then Grand Children etc from left to right), this is where I'm stuck. Here is my TreeNode class:
    class TreeNode {
      Object element;
      TreeNode left;
      TreeNode right;
      public TreeNode(Object o) {
        element = o;
    }Each node has a reference to its Children nodes etc. Here is how my tree looks like. Mine is similar to this: http://www.codeproject.com/KB/vb/SimpleBTree.aspx
    All the lectures I have read in the net are talking about Queue, but my problem is reading the tree in BFS Traversal order. It's almost 4 days I'm trying to solve this probelm, but can't come up with something. Any help is greatly appreciated.
    Here is my Binary Tree class:
    public class BinaryTree {
         private TreeNode root;
         private int size = 0;
         /** 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);
    /** 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);
    size++;
    return true; // Element inserted
    /** 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 static class TreeNode {
    Object element;
    TreeNode left;
    TreeNode right;
    public TreeNode(Object o) {
    element = o;
    /** Get the number of nodes in the tree */
    public int getSize() {
    return size;
    /** Search element o in this binary tree */
    public boolean search(Object o){
    TreeNode temp = root;
    boolean found = false;
    if(temp == null)
    found = false;
    else if(((Comparable)(temp.element)).compareTo(o) == 0 && temp != null)
    found = true;
    else if(((Comparable)temp.element).compareTo(o) > 0){
    root = temp.left;
    found = search(o);
    else{
    root = temp.right;
    found = search(o);
    return found;
    /** Display the nodes in breadth-first traversal */
    public void breadthFirstTraversal(){
    TreeNode temp = root;
    // TreeNode leftChild = temp.left;
    // TreeNode rightChild = temp.right;
    MyQueue s = new MyQueue();
    s.enqueue(root);
    // while (s.getSize() == 0){
    System.out.println(s);
    // private void breadthFirstTraversal(TreeNode node){

    ChangBroot wrote:
    All the lectures I have read in the net are talking about Queue, but my problem is reading the tree in BFS Traversal order. It's almost 4 days I'm trying to solve this probelm, but can't come up with something. Any help is greatly appreciated. One simple strategy is to make an ordinary recursive traversal of the tree. Along in the traversal you keep an array of linked lists. When you visit a node you just add it to the list at the entry in the array corresponding to the depth of this node.
    After the traversal you have an array with linked lists. Each list holds the nodes found at a certain tree depth. So each list holds all nodes corresponding to a specific tree "breadth", namely all nodes found at the same tree depth.

  • How to find square root, log recursively???

    I need to find the square root of a number entered recursively and log as well. Your help would be greatly appreciated. Thanks in advance!
    import java.io.*;
    /**Class provides recursive versions
    * of simple arithmetic operations.
    public class Ops2
         private static BufferedReader in = null;
         /**successor, return n + 1*/
         public static int suc(int n)
              return n + 1;
         /**predecessor, return n - 1*/
         public static int pre(int n)
              if (n == 0)
                   return 0;
              else
                   return n - 1;
         /**add two numbers entered*/
         public static int add(int n, int m)
              if (m == 0)
                   return n;
              else
                   return suc(add(n, pre(m)));
         /**subtract two numbers entered*/
         public static int sub(int n, int m)
              if (n < m)
                   return 0;
              else if (m == 0)
                   return n;
              else
                   return pre(sub(n, pre(m)));
         /**multiply two numbers entered*/
         public static int mult(int n, int m)
              if (m == 0)
                   return 0;
              else
                   return add(mult(n, pre(m)), n);
         /**divide two numbers entered*/
         public static int div(int n, int m)
              if (n < m)
                   return 0;
              else
                   return suc(div(sub(n, m), m));
         /**raise first number to second number*/
         public static int exp(int n, int m)
              if (m == 0)
                   return 1;
              else
                   return mult(exp(n, pre(m)), n);
         /**log of number entered*/
         public static int log(int n)
              if (n < 2)
                   return 0;
              else
                   return suc(log(div(n, 2)));
         /**square root of number entered*/
         public static int sqrt(int n)
              if (n == 0)
                   return 0;
              else
                   return sqrt(div(n, ));
         /**remainder of first number entered divided by second number*/
         public static int mod(int n, int m)
              if (n < m)
                   return 0;
              else
                   return mod(div(n, pre(m)), m);
         public static void prt(String s)
              System.out.print(s);
         public static void prtln(String s)
              System.out.println(s);
         public static void main(String [ ] args)
              prtln("Welcome to the amazing calculator");
              prtln("It can add, multiply and do powers for");
              prtln("naturals (including 0). Note that all the");
              prtln("HARDWARE does is add 1 or substract 1 to any number!!");
              in = new BufferedReader(new InputStreamReader ( System.in ) );
              int It;
              while ( (It = getOp()) >= 0)
                   prt("" + It + "\n");
            private static int getOp( )
            int first, second;
            String op;
            try
                System.out.println( "Enter operation:" );
                do
                    op = in.readLine( );
                } while( op.length( ) == 0 );
             System.out.println( "Enter first number: " );
                first = Integer.parseInt( in.readLine( ) );
                System.out.println( "Enter second number: " );
                second = Integer.parseInt( in.readLine( ) );
             prtln("");
             prt(first + " " + op + " " + second + " = ");
                switch( op.charAt( 0 ) )
                  case '+':
                    return add(first, second);
                  case '-':
                       return sub(first, second);
                  case '*':
                    return mult(first, second);
                  case '/':
                       return div(first, second);
                  case '^':
                    return exp(first, second);
                  case 'v':
                       return log(first);
                  case 'q':
                       return sqrt(first);
                  case '%':
                       return mod(first, second);
                  case 's':
                       return suc(first);
                  case 'p':
                       return pre(first);
                  default:
                    System.err.println( "Need +, *, or ^" );
                    return -1;
            catch( IOException e )
                System.err.println( e );
                return  0;
    }

    Hi,
    Is there any one to make a program for me in Turbo
    C++ for Dos, which can calculate the square root of
    any number without using the sqrt( ) or any ready
    made functions.
    The program should calculate the s.root of the number
    by a formula or procedure defined by the user
    (programmer).
    Thanks.This is a Java forum!
    If you want Java help:
    1. Start your own thread.
    2. Use code tags (above posting box) if you post code.
    3. No one will write the program for you. We will help by answering your questions and giving advice on how to fix problems in code you wrote.
    4. The formula you need to implement is given above by dizzy.

  • Traverse a binary tree from root to every branch

    I have a couple of other questions. I need to get all the different combinations of a binary tree and store them into a data structure. For the example in the code below, the combinations would be:
    1) Start, A1, A2, A3, B1, B2, B3
    2) Start, A1, A2, B1, A3, B2, B3
    3) Start, A1, A2, B1, B2, A3, B3
    4) Start, A1, A2, B1, B2, B3, A3
    5) Start, A1, B1, A2, A3, B2, B3
    etc.
    I understand that this is very similar to the preorder traversal, but preorder does not output the parent nodes another time when the node splits into a left and right node. Any suggestions?
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    package binarytreetest;
    import java.util.ArrayList;
    import java.util.Iterator;
    * @author vluong
    public class BinaryTreeTest {
         * @param args the command line arguments
        public static void main(String[] args) {
            // TODO code application logic here
            int countA = 0;
            int countB = 0;
            ArrayList listA = new ArrayList();
            ArrayList listB = new ArrayList();
            listA.add("A1");
            listA.add("A2");
            listA.add("A3");
            listB.add("B1");
            listB.add("B2");
            listB.add("B3");
            //listB.add("B1");
            Node root = new Node("START");
            constructTree(root, countA, countB, listA, listB);
            //printInOrder(root);
            //printFromRoot(root);
        public static class Node{
            private Node left;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        public static void constructTree(Node node, int countA, int countB, ArrayList listA, ArrayList listB){
            if(countA < listA.size()){
                if(node.left == null){
                    System.out.println("There is no left node. CountA is " + countA);
                    System.out.println("Created new node with value: " + listA.get(countA).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.left = new Node(listA.get(countA).toString()); 
                    constructTree(node.left, countA+1, countB, listA, listB);   
                }else{
                    System.out.println("There is a left node. CountA + 1 is " + countA+1);
                    constructTree(node.left, countA+1, countB, listA, listB);   
            if(countB < listB.size()){
                if(node.right == null){
                    System.out.println("There is no right node. CountB is " + countB);
                    System.out.println("Created new node with value: " + listB.get(countB).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.right = new Node(listB.get(countB).toString());
                    constructTree(node.right, countA, countB+1, listA, listB);
                }else{
                    System.out.println("There is a right node. CountB + 1 is " + countB+1);
                    constructTree(node.right, countA, countB+1, listA, listB);
        }My second question is, if I need to add another list (listC) and find all the combinations of List A, listB and list C, is it correct to define the node class as
    public static class Node{
            private Node left;
            private Node mid;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        }Node left = listA, Node mid = listB, Node right = listC
    The code for the 3 lists is below.
    3 lists (A, B, C):
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    package binarytreetest;
    import java.util.ArrayList;
    * @author vluong
    public class BinaryTreeTest {
         * @param args the command line arguments
        public static void main(String[] args) {
            // TODO code application logic here
            insert(root, "A1");
            insert(root, "A2");
            insert(root, "B1");
            insert(root, "B2"); 
            insert(root, "A2");
            int countA = 0;
            int countB = 0;
            int countC = 0;
            ArrayList listA = new ArrayList();
            ArrayList listB = new ArrayList();
            ArrayList listC = new ArrayList();
            listA.add("A1");
            listA.add("A2");
            //listA.add("A3");
            listB.add("B1");
            listB.add("B2");
            //listB.add("B3");
            //listB.add("B1");
            listC.add("C1");
            listC.add("C2");
            Node root = new Node("START");
            constructTree(root, countA, countB, countC, listA, listB, listC);
            //ConstructTree(root, countA, countB, listA, listB);
            //ConstructTree(root, countA, countB, listA, listB);
            printInOrder(root);
            //printFromRoot(root);
        public static class Node{
            private Node left;
            private Node mid;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        public static void constructTree(Node node, int countA, int countB, int countC, ArrayList listA, ArrayList listB, ArrayList listC){
            if(countA < listA.size()){
                if(node.left == null){
                    System.out.println("There is no left node. CountA is " + countA);
                    System.out.println("Created new node with value: " + listA.get(countA).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.left = new Node(listA.get(countA).toString()); 
                    constructTree(node.left, countA+1, countB, countC, listA, listB, listC);   
                }else{
                    System.out.println("There is a left node. CountA + 1 is " + countA+1);
                    constructTree(node.left, countA+1, countB, countC, listA, listB, listC);   
            if(countB < listB.size()){
                if(node.mid == null){
                    System.out.println("There is no mid node. CountB is " + countB);
                    System.out.println("Created new node with value: " + listB.get(countB).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.mid = new Node(listB.get(countB).toString());
                    constructTree(node.mid, countA, countB+1, countC, listA, listB, listC);
                }else{
                    System.out.println("There is a right node. CountB + 1 is " + countB+1);
                    constructTree(node.mid, countA, countB+1, countC, listA, listB, listC);
            if(countC < listC.size()){
                if(node.right == null){
                    System.out.println("There is no right node. CountC is " + countC);
                    System.out.println("Created new node with value: " + listC.get(countC).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.right = new Node(listC.get(countC).toString());
                    constructTree(node.right, countA, countB, countC+1, listA, listB, listC);
                }else{
                    System.out.println("There is a right node. CountC + 1 is " + countC+1);
                    constructTree(node.mid, countA, countB, countC+1, listA, listB, listC);
        }Thank you in advance!

    It looks to me like you are interleaving two lists. It looks like you are doing this while leaving the two subsequences in their original order.
    If that is in fact what you are doing, then this is just a combinatorics problem. Here is psuedo code (NOT java!)
    List path = new List();
    show(List A, int a, List B, int b, path){
      if(a >= A.length() && b >= b.length()){
        spew(path);
      } else {
        if(a < A.length()){path.push(A[a]); show(A,a+1,B,b,); path.pop();}
        if(b < B.length()){path.push(B); show(A,a,B,b+1,); path.pop();}
    show(A, 0, B, 0);
    In order to interleave 3 lists, you would add C and c arguments to the function and you would add one more line in the else block.

  • Recursion accessment

    1.     Write an iterative and a recursive version of the Fibonacci series algorithm. You need to ensure the correctness of the both algorithms. Both algorithms should produce similar output if given a similar input.
    a.     Measure the performance of the two algorithms by measuring the time for both algorithms to listing out 10, 20, 30, 40, 50, 60, 70 and 80 of Fibonacci numbers. The listing procedure could be done with a loop. For each test, repeat 3 times and get the average value.

    Hi Anirudh,
    I see that you've registered just a few days back.I've seen that you've been using a lot of non-words like 'u' instead of 'you' etc.Just try to avoid them.It is not accepted at the forums here since it's very annoying and irritating and leaves an impression about you being lazy.
    Regards,
    Swapnaja
    P.S:Do not take me wrong.This is what I've seen here at sun-forums.Just thought I'd let you know.

  • Draw lines recurrently VS. recursively

    Hey, guys.
    Last time when I wanted to magnify lines drawed by g.drawline(...), I tried to call drawline() recurrently:
    for (int i = 0; i < magnifiedPixels; i++) {
    g.drawLine(x, y-i, x1, y1);
    g.drawLne(x,y+i, x2, y1+i);
    }However, the result turned to be disappointing: only the most outside lines was drawn. But when I tried to call it recursively, everything became ok, the code is as below:
    void manifyline(int magnifiedPixels, int x1, int y1, int x2, int y2) {
    if (magnifiedPixels == 0)
      return;
    g2.drawLine(x1, y1 +magnifiedPixels, x2, y2 + magnifiedPixels);
    g2.drawLine(x1, y1 - magnifiedPixels, x2, y2 - magnifiedPixels);
    magnifyLine(magnifiedPixels- 1, x1, y1, x2, y2);
    }now, althought I have already known this can be set by setStroke(), I still quite confuse about the phenomena above, I can't find any logical difference between them, so I think this might have something to do wiht the graphics/graphics2D class, but I'm not sure about the inner mechanism. can anybody give a hand? Thanks :-)

    I see a difference. Your recursive version looks more like this for-loop:
    for (int i = magnifiedPixels; i > 0; i--) {
    g.drawLine(x1, y1 + i, x2, y2 + i);
    g.drawLine(x1, y1 - i, x2, y2 - i);
    }

  • Problem about tree

    Hi,everyone,I am just new to java.And now I got a problem with storing the following expression into a binary tree:
    The expression is like: ((a/b)+((c-d)*e)) in a txt file.
    so,what i want to do is to store variable and operation(+-*/)into a tree.And calculate that by using preorder traversal such as
    +(/(a,b),*(-(c,d),e)).However,i even don't know how to start coding.
    +
    a b - e
    c d
    the data i want to be stored in a tree will be like above.Then,I need to use inorder traversal to display the final formula like ((a/b)+((c-d)*e))
    Please get me some help.Thank you very much from everybody!

    Hi,
    don't have any code to answer your question but here's what I'll suggest:
    1) Define a class whose job will be to represent a simple expression. A simple expression is defined by '<exprX> <operator> <exprY>'. In this class, you must include a way to distinguish expressions from variables.
    With your sample, there would be N expressions:
    expr1 = (a / b)
    expr2 = (c - d)
    expr3 = (expr2 * e)
    expr4 = (expr1 + expr3)
    2) Define a class whose job will be to parse the formula, and create the expressions. The idea would be to find operators, and create expressions on left / right sides of the operators (I agree, it's a little harder than that, but I only have ideas right now...)
    Also you'll have to store some kind of 'level info', perhaps here should be the use of the tree, keeping track of each level of computation (expr4 will be at top level, then expr3 under it, then expr2 and expr1)
    Use of recursion seems evident here (and seems simple to apply to a tree structure):
    - first parse will give expr4 = (expr1 + expr3) (both have to be parsed again)
    - second parse will occur on expr1 = (a / b) and expr3 = (expr2 * e) (then expr3 has to be parsed)
    - third parse will occur on expr2 = (c - d)
    That's my two cents... sorry missing time for more help, try starting with this I'll follow the thread and help more if I can!
    Regards.

  • MorseCode Binary Tree

    So I have an assignment to write a program that deciefers basic morse code using a binary tree. A file was provided with the information for the binary tree and I am using the text books author's version of BinaryTree class with a few methods of my own thrown in.
    For starters .. why would you ever use a tree for this .. just make a look up table. But my real problem is i keep getting null pointers at 38, 24, 55 and I have tried just about everything I know to do at this point. My mind is exhausted and I think I need a fresh pair of eyes to tell me what I have done wrong.
    I am sorry for such sloppy code.. I have been changing and rearranging too much.
    import java.io.*;
    import java.util.*;
    public class MorseCode extends BinaryTree{
         static BufferedReader in;
         static BinaryTree<String> bT = new BinaryTree<String>();
    /*     public static void loadTree() throws FileNotFoundException, IOException{
              in = new BufferedReader(new FileReader("MorseCode.txt"));
              bT = readBinaryTree(in);
         public static String decode(Character c) throws IOException{
              if(c.equals("null")){
                   return "";
              }else if(c.equals(" ")){
                   return " ";
              }else{
                   return (":" + find(c));
         public static String find(Character c) throws IOException, FileNotFoundException{
              in = new BufferedReader(new FileReader("MorseCode.txt"));
              bT = readBinaryTree(in);
              Queue<BinaryTree> data = new LinkedList<BinaryTree>();
              BinaryTree<String> tempTree = bT;
              String temp = null;
              Character tempChar = null;
              data.offer(tempTree);
              while(!data.isEmpty()){
                   tempTree = data.poll();
                   temp = tempTree.getData();
                   tempChar = temp.charAt(0);
                   if(tempChar.equals(c)){
                        break;
                   data.offer(tempTree.getRightSubtree());
                   data.offer(tempTree.getLeftSubtree());
              return temp.substring(2);               
         public static void main(String[] args) throws FileNotFoundException, IOException{
              Scanner scan = new Scanner(new FileReader("encode.in.txt"));
              String s = "";
              String temp = "";
              while(scan.hasNextLine()){
                    temp = scan.nextLine();
                    for(int i = 0; i < temp.length(); i++){
                         s = s + decode(temp.charAt(i));
              System.out.println(s);
    /** Class for a binary tree that stores type E objects.
    *   @author Koffman and Wolfgang
    class BinaryTree <E> implements Serializable
      //===================================================
      /** Class to encapsulate a tree node. */
      protected static class Node <E> implements Serializable
        // Data Fields
        /** The information stored in this node. */
        protected E data;
        /** Reference to the left child. */
        protected Node <E> left;
        /** Reference to the right child. */
        protected Node <E> right;
        // Constructors
        /** Construct a node with given data and no children.
            @param data The data to store in this node
        public Node(E data) {
          this.data = data;
          left = null;
          right = null;
        // Methods
        /** Return a string representation of the node.
            @return A string representation of the data fields
        public String toString() {
          return data.toString();
      }//end inner class Node
      //===================================================
      // Data Field
      /** The root of the binary tree */
      protected Node <E> root;
      public BinaryTree()
        root = null;
      protected BinaryTree(Node <E> root)
        this.root = root;
      /** Constructs a new binary tree with data in its root,leftTree
          as its left subtree and rightTree as its right subtree.
      public BinaryTree(E data, BinaryTree <E> leftTree, BinaryTree <E> rightTree)
        root = new Node <E> (data);
        if (leftTree != null) {
          root.left = leftTree.root;
        else {
          root.left = null;
        if (rightTree != null) {
          root.right = rightTree.root;
        else {
          root.right = null;
      /** Return the left subtree.
          @return The left subtree or null if either the root or
          the left subtree is null
      public BinaryTree <E> getLeftSubtree() {
        if (root != null && root.left != null) {
          return new BinaryTree <E> (root.left);
        else {
          return null;
      /** Return the right sub-tree
            @return the right sub-tree or
            null if either the root or the
            right subtree is null.
        public BinaryTree<E> getRightSubtree() {
            if (root != null && root.right != null) {
                return new BinaryTree<E>(root.right);
            } else {
                return null;
         public String getData(){
              if(root.data == null){
                   return "null";
              }else{
                   return (String) root.data;
      /** Determine whether this tree is a leaf.
          @return true if the root has no children
      public boolean isLeaf() {
        return (root.left == null && root.right == null);
      public String toString() {
        StringBuilder sb = new StringBuilder();
        preOrderTraverse(root, 1, sb);
        return sb.toString();
      /** Perform a preorder traversal.
          @param node The local root
          @param depth The depth
          @param sb The string buffer to save the output
      private void preOrderTraverse(Node <E> node, int depth,
                                    StringBuilder sb) {
        for (int i = 1; i < depth; i++) {
          sb.append("  ");
        if (node == null) {
          sb.append("null\n");
        else {
          sb.append(node.toString());
          sb.append("\n");
          preOrderTraverse(node.left, depth + 1, sb);
          preOrderTraverse(node.right, depth + 1, sb);
      /** Method to read a binary tree.
          pre: The input consists of a preorder traversal
               of the binary tree. The line "null" indicates a null tree.
          @param bR The input file
          @return The binary tree
          @throws IOException If there is an input error
      public static BinaryTree<String> readBinaryTree(BufferedReader bR) throws IOException
        // Read a line and trim leading and trailing spaces.
        String data = bR.readLine().trim();
        if (data.equals("null")) {
          return null;
        else {
          BinaryTree < String > leftTree = readBinaryTree(bR);
          BinaryTree < String > rightTree = readBinaryTree(bR);
          return new BinaryTree < String > (data, leftTree, rightTree);
      }//readBinaryTree()
      /*Method to determine the height of a binary tree
        pre: The line "null" indicates a null tree.
          @param T The binary tree
          @return The height as integer
      public static int height(BinaryTree T){
            if(T == null){
               return 0;
          }else{
               return 1 +(int) (Math.max(height(T.getRightSubtree()), height(T.getLeftSubtree())));
      public static String preOrderTraversal(BinaryTree<String> T){
          String s = T.toString();
          String s2 = "";
          String temp = "";
          Scanner scan = new Scanner(s);
          while(scan.hasNextLine()){
               temp = scan.nextLine().trim();
               if(temp.equals("null")){
                   s2 = s2;
              }else{
                   s2 = s2 + " " + temp;
          return s2;
    }//class BinaryTree

    As well as warnerja's point, you say you keep getting these errors. Sometimes it's helpful when illustrating a problem to replace the file based input with input that comes from a given String. That way we all see the same behaviour under the same circumstances.
    public static void main(String[] args) throws FileNotFoundException, IOException{
        //Scanner scan = new Scanner(new FileReader("encode.in.txt"));
        Scanner scan = new Scanner("whatever");The following isn't the cause of an NPE, but it might be allowing one to "slip through" (ie you think you've dealt with the null case when you haven't):
    public static String decode(Character c) throws IOException{
        if(c.equals("null")){
    c is a Character so it will never be the case that it is equal to the string n-u-l-l.
    Perhaps the behaviour of each of these methods needs to be (documented and) tested.

  • Please help break our java parser

    Hello,
    We are working on making a Java code parser that will insert timestamp before and after any synchronized events (including wait(), notify() and notifyall()). It will parse in the source code, remove comments and carriage returns (replacing with spaces). It will then replace �{� with � { �, �;� with �; �, and also have
    while(stringA.indexOf(". ")>0)
    replace(". ", ".");
    We'll then splitting the source code by spaces and check each of the tokens to see if they are a synchronized method. If it isn�t then simply return the token however if they are we will add our logging around the token and then return that (i.e. logHere(); wait(); logHere().
    Is there any other possibilities that are not covered by the way we parse a Java code?
    Thanks for your help and time!
    -Team NN

    The problem I have is I can make the tree using an array but I need to know how to turn this into code to make the RegularExpression object to be returned.
    ie if RE entered by user is a|b, I know how to make it |ab in array
    if RE entered by user is ab, I know how to make it .ab in array
    I need to know how I can than use this to recursively generate the RegularExpression object. I don't have trouble with + and '|', but I dont know how to use a recursive method to return new sybol
    Example: If Regularexpression is abc I am able to get a string from the array .a.bc
    How do I make this a RE object. The tree is right associative so I know you have to use a preorder traversal, any ideas.
    Thanks for the help before hand.
    Thank you

  • Decode not called for all UIComponents in tree

    Many of the faces .jsp pages I have been working with in EA2 have not been updating their models properly.
    The symptom I have observed is that the decode method is not called for all of the UIComponents on the page.
    I think I have tracked this down to a bug in the class com.sun.faces.tree.TreeNavigatorImpl. This class appears to be used internally by some of the .jsf code to navigate the component tree.
    Studying various stack traces, it looks like the method TreeNavigatorImpl.getNextStart() is supposed to provide a preorder traversal of the component tree. Starting from the root of the tree, each call is expected to return the next node. Experimental evidence suggests that it is not doing that properly, and it fails to visit all the nodes in the tree.
    For example, if my component tree looks like this (this is a representation of the tree; not an example of a .jsp page):
    <node id = "/">
       <node id = "page">
          <node id = "carStoreForm">
             <node id = "ba0">
                 <node id = "ba1">
                     <node id = "ba3"/>
                     <node id = "br4"/>
                 </node>
             </node>
             <node id = "bold1"/>
             <node id = "more1"/>
          </node>
       </node>
    </node>A preorder traversal of these nodes should visit nodes:
    '/page'
    '/page/carStoreForm'
    '/page/carStoreForm/ba0'
    '/page/carStoreForm/ba0/ba1'
    '/page/carStoreForm/ba0/ba1/ba3'
    '/page/carStoreForm/ba0/ba1/br4'
    '/page/carStoreForm/bold1'
    '/page/carStoreForm/more1'
    However, when I write test code that calls TreeNavigatorImpl.getNextStart() directly, only the following nodes are returned:
    '/page'
    '/page/carStoreForm'
    '/page/carStoreForm/ba0'
    '/page/carStoreForm/ba0/ba1'
    '/page/carStoreForm/ba0/ba1/ba3'
    '/page/carStoreForm/ba0/ba1/br4'
    It looks to me like the method loses track of the state of the traversal, and prematurely returns null before all the nodes are visited. (It is failing to return the "bold1" and "more1" nodes.)
    This is all extremely speculative. Without jsf source or doc for any of the tree classes, it is difficult to know what is supposed to be going on. And, of course, I may just have a bug in my code.

    Okay, rather than wait for Max to respond, I decompiled the TreeNavigatorImpl class myself and studied the source code. The
    problem arises in the getNextStart() method. If the method returns
    a null value, then presumably the class has successfully traversed
    the entire tree in preorder. Unfortunately, there was a slight
    logic error that would halt traversal after you got to the last node
    of the last subtree at the beginning of your travels.
    The following code should correct this situation (let me know if I've
    introduced any new problems into the mix...). I tested this out using the simple example that Max describes above. The test code appears at the end of my revised method:
    public UIComponent getNextStart() {
    UIComponent cur = null;
    if (startTraversalDone) {
    return cur;
    if (startStack.empty()) {
    cur = root;
    Iterator iter = cur.getChildren();
    if (iter.hasNext()) {
    startStack.push(iter);
    else {
    while (!startStack.empty()) {
         Iterator iter = (Iterator) startStack.peek();
         if (iter != null && iter.hasNext()) {
         cur = (UIComponent) iter.next();
         Iterator childIter = cur.getChildren();
         if (childIter != null && childIter.hasNext()) {
         startStack.push(childIter);
         else {
         if (!iter.hasNext()) {
         startStack.pop();
         break;
    else {
         startStack.pop();
    if (startStack.empty()) {
    startTraversalDone = true;
    if (cur != null) {
    endStack.push(cur);
    return cur;
         public static void main(String[] args) {
              MyComp root = new MyComp("root");
              // build tree....
              MyComp page = new MyComp("page");
              root.addChild(page);
              MyComp csf = new MyComp("csf");
              page.addChild(csf);
              MyComp ba0 = new MyComp("ba0");
              csf.addChild(ba0);
              csf.addChild(new MyComp("bold1"));
              csf.addChild(new MyComp("more1"));
              MyComp ba1 = new MyComp("ba1");
              ba0.addChild(ba1);
              ba1.addChild(new MyComp("ba3"));
              ba1.addChild(new MyComp("ba4"));
              MyTreeNavigator nav = new MyTreeNavigator(root);
              MyComp comp = null;
              while ((comp = (MyComp) nav.getNextStart()) != null) {
                   System.out.println(comp.getComponentId());
    public class MyComp extends UIComponentBase {
         public MyComp(String id) {
              this.setComponentId(id);
         public String getComponentType() {
              return "MyComp";

  • How to find and modify  item in a nested array collection?

    Hi,
    would anybody know how to find and modify item in a nested
    array collection:
    private var ac:ArrayCollection = new ArrayCollection([
    {id:1,name:"A",children:[{id:4,name:"AA",children:[{id:8,name:"AAA"}]},{id:5,name:"AB"}]} ,
    {id:2,name:"B",children:[{id:6,name:"BA"},{id:7,name:"BB"}]},
    {id:3,name:"C"}
    Let's say I've got object {id:8, name:"X"} , how could I find
    item in a collection with the correspoding id property, get handle
    on it and update the name property of that object?
    I'm trying to use this as a dataprovider for a tree populated
    via CF and remoting....
    Thanks a lot for help!

    Thanks a lot for your help!
    In the meantime I've come up with a recursive version of the
    code.
    This works and replaces the item on any level deep:
    private function findInAC(ac:ArrayCollection):void{
    var iMatchValue:uint=8;
    for(var i:uint=0; i<ac.length; i++){
    if(ac
    .id == iMatchValue){
    ac.name = "NEW NAME";
    break;
    if(ac
    .children !=undefined){
    findInAC( new ArrayCollection(ac.children));
    However, if I use the array collection as a dataprovider for
    a tree and change it, the tree doesn't update, unless I collapse
    and reopen it.
    Any ideas how to fix it ?

  • 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.

  • About tree

    Hi,everyone,I am just new to java.And now I got a problem with storing the following expression into a binary tree:
    The expression is like: ((a/b)+((c-d)*e)) in a txt file.
    so,what i want to do is to store variable and operation(+-*/)into a tree.And calculate that by using preorder traversal such as
    +(/(a,b),*(-(c,d),e)).However,i even don't know how to start coding.
    +
    a b - e
    c d
    the data i want to be stored in a tree will be like above.Then,I need to use inorder traversal to display the final formula like ((a/b)+((c-d)*e))
    Please get me some help.Thank you very much from everybody!

    Right. You want to write a parser, that turns that expression into a "parse tree", which is a data structure that represents more explicitly the information expressed in the expression.
    This is a homework assignment, of course.
    Anyway, I'd suggest looking at StringTokenizer to first tokenize the expression into a series of (you guessed it) tokens. The parser then only deals with the series of tokens.

Maybe you are looking for