-1

I am saving the keys of the tree in an array by doing an inorder traversal on the tree.

I am using counter variable in the function private void inOrder(Node node,K[] keys,int counter) and add the keys to the array while incrementing the counter variable after each addition. The problem, however, is that because of recursion the value of counter is reset to 0. I also tried making counter static but it complicates the problem even more and doesn't solve it either.

Below is the full code.

package lab8;
import java.util.Set;

public interface Map61B<K, V> extends Iterable<K> {
    /** Removes all of the mappings from this map. */
    void clear();

    /* Returns true if this map contains a mapping for the specified key. */
    boolean containsKey(K key);

    /* Returns the value to which the specified key is mapped, or null if this
     * map contains no mapping for the key. 
     */
    V get(K key);

    /* Returns the number of key-value mappings in this map. */
    int size();

    /* Associates the specified value with the specified key in this map. */
    void put(K key, V value);

    /* Returns a Set view of the keys contained in this map. */
    Set<K> keySet();    

    /* Removes the mapping for the specified key from this map if present.
     * Not required for Lab 8. If you don't implement this, throw an 
     * UnsupportedOperationException. */
    V remove(K key);

    /* Removes the entry for the specified key only if it is currently mapped to
     * the specified value. Not required for Lab 8. If you don't implement this,
     * throw an UnsupportedOperationException.*/
    V remove(K key, V value);
}

package lab8;
import java.util.Set;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class BSTMap<K extends Comparable<K>,V> implements Map61B<K,V> {

    Node root;
    int size;

    class Node{
        K key;
        V value;
        Node left,right; 

        public Node(){}

        public Node(K k,V v){
            key=k;
            value=v;
        }
    }

    public BSTMap(){}


    /** Removes all of the mappings from this map. */
    public void clear(){
        root=null;
        size=0;
    }

    /* Returns true if this map contains a mapping for the specified key. */
    public boolean containsKey(K key){
        return get(key) != null;
    }

    /* Returns the value to which the specified key is mapped, or null if this
     * map contains no mapping for the key. 
     */
    public V get(K key){

        if(size()==0)
            return null;

        Node temp=root;
        //System.out.println("temp:"+temp+" "+temp.key);
        while(temp!=null){
            int comp=temp.key.compareTo(key);
            if(comp==0)
                return temp.value;
            else if(comp<0)
                temp=temp.left;
            else
                temp=temp.right;
        }
        return null;
    }

    /* Returns the number of key-value mappings in this map. */
    public int size(){
        return size;
    }


    //private recursive method
    private Node put(Node node,K key,V value){
        if(node==null)
            return new Node(key,value);
        int comp;
        comp=key.compareTo(node.key);
        if(comp==0)
            return node;
        else if(comp<0)
            node.left=put(node.left,key,value);
        else
            node.right=put(node.right,key,value);
        return node;
    }

    /* Associates the specified value with the specified key in this map. */
    public void put(K key, V value){
        root=put(root,key,value);
        size++;
        return;
    }



    public void printInOrder(){
        if(size()==0){
            System.out.println("list empty");
            return;
        }
        inOrder(root);

    }

    private void printNode(Node node){
        System.out.print("("+node.key+" "+node.value+")");
    }

    private void inOrder(Node node){
        if(node==null)
            return;
        inOrder(node.left);
        printNode(node);
        inOrder(node.right);
    }

    private void inOrder(Node node,Set keySet){
        if(node==null)
            return ;
        inOrder(node.left,keySet);
        //System.out.println("Adding key:"+node.key);
        keySet.add(node.key);
        inOrder(node.right,keySet);
    }

    private void inOrder(Node node,K[] keys,int counter){
        if(node==null)
            return ;
        inOrder(node.left,keys,counter);
        System.out.println("Adding key to array at location:"+counter+" key:"+node.key);
        keys[counter++]=node.key;
        inOrder(node.right,keys,counter);
    }

    public Set<K> keySet(){
        if(root==null)
            return null;
        Set<K> keys=new HashSet<K>();
        inOrder(root,keys);
        return keys;
    }    

    public V remove(K key){
        throw new UnsupportedOperationException();
    }

    public V remove(K key, V value){
        throw new UnsupportedOperationException();  
    }

    public  class KeyIterator implements Iterator<K>{
        private K[] keys;
        private int counter;

        public KeyIterator(){
            keys=(K[])new Comparable[size];
            //(K[])new Comparable[size];
            inOrder(root,keys,counter);

            System.out.println("Printing inside constrcutor");
            for(int i=0;i<keys.length;i++)
                System.out.print(keys[i]+" ");
            System.out.println();

        }

        public boolean hasNext(){
            return counter<keys.length;
        }

        public K next(){
            return keys[counter++];
        }
        public void remove(){

        }
    }

    public Iterator<K> iterator(){
        Iterator<K> seer=new KeyIterator();

        return seer;
    }

    public static void main(String[] args) {
        BSTMap<String, String> a = new BSTMap<String, String>();
        BSTMap<String, Integer> b = new BSTMap<String, Integer>();

        b.put("C", 1);
        System.out.println(b.get("C"));
        b.put("A", 2);
        b.put("B", 3);
        b.put("G", 4);
        b.printInOrder();
        System.out.println();
        System.out.println("keys are:"+b.keySet());

        System.out.println("Printing via enhanced for loop:");
        for(String str:b)
            System.out.println(str);

        //Above code is same as saying
        System.out.println("Printing the legendary iterator:");
        Iterator<String> seer=b.iterator();
        while(seer.hasNext()){
            System.out.println(seer.next());
        }

    }

}

The output is below

1
(A 2)(B 3)(C 1)(G 4)
keys are:[A, B, C, G]
Printing via enhanced for loop:
Adding key to array at location:0 key:A
Adding key to array at location:1 key:B
Adding key to array at location:0 key:C
Adding key to array at location:1 key:G
Printing inside constrcutor
C G null null
C
G
null
null
Md Faisal
  • 2,931
  • 8
  • 29
  • 34
  • 1
    The code is incomplete and does not allow to replicate the problem. – Witold Kaczurba Dec 24 '16 at 07:52
  • Actually the code is very big so I thought of putting only the relevant code. – Md Faisal Dec 24 '16 at 07:55
  • pushing the code on GitHub, will post the link in a minute – Md Faisal Dec 24 '16 at 07:58
  • here is the link to code https://github.com/fsl4faisal/skeleton-sp16/blob/master/lab8/lab8/BSTMap.java -- I have changed the code at line 150 to-- keys=(K[])new Comparable[size]; and it seem to have suppressed the error but iterator is still not working, I am using the counter variable in inOrder() fn to save the items in the array, but the code is still buggy. – Md Faisal Dec 24 '16 at 08:12
  • Thx for the code. Can you do a [Minimal, Complete, and Verifiable example](http://stackoverflow.com/help/mcve)? – Ole V.V. Dec 24 '16 at 08:20
  • 1
    I ran the code from github and got no Exceptions. – Witold Kaczurba Dec 24 '16 at 08:24
  • @Vito that's because I changed it to-- keys=(K[])new Comparable[size] mentioned in comments above. well' it still isn't working though – Md Faisal Dec 24 '16 at 09:44
  • “isn’t working”, excuse me, it’s not a useable problem description. You need to edit the question to include precise observed behaviour. – Ole V.V. Dec 24 '16 at 11:16
  • @Ole actually I wasn't sure if I could do that, Thank you for making me clear, I will edit the question now – Md Faisal Dec 24 '16 at 11:31
  • @Ole I have edited the question and shared my insight of why it isn't working – Md Faisal Dec 24 '16 at 11:51
  • I see your problem with the `counter`variable. You need to have one such variable for the whole in-order traversal. I haven’t got a ready-made design proposal for it, though. There are some options. – Ole V.V. Dec 24 '16 at 13:11
  • I am open to suggestions :) – Md Faisal Dec 24 '16 at 13:16

1 Answers1

2

Instead of using an Array I used an ArrayList and it solved the problem. The problem with the previous code was that the counter used to reset to 0 during the recursive call to inOrder since it was a local variable. Changing it to array list eliminated the counter variable with add() function and it solved the problem Below is the code for the same:-

import java.util.Set;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class BSTMap<K extends Comparable<K>,V> implements Map61B<K,V> {

    Node root;
    int size;

    class Node{
        K key;
        V value;
        Node left,right,parent; 

        public Node(){}

        public Node(K k,V v,Node p){
            //System.out.println(k+" "+v+" "+p);
            key=k;
            value=v;
            parent=p;
        }
    }


    public class KeyIterator implements Iterator<K>{
        private ArrayList<K> keys;
        private int counter;

        public KeyIterator(){
            counter=0;
            keys=new ArrayList<K>();
            inOrder(root,keys);

            System.out.println("KeyIterator()");
            for(K k:keys)
                System.out.print(k+" ");
            System.out.println();

        }

        public boolean hasNext(){
            return counter<keys.size();
        }

        public K next(){
            return keys.get(counter++);
        }
        public void remove(){

        }
    }

    public Iterator<K> iterator(){
     Iterator<K> seer=new KeyIterator();

     return seer;
 }


 public static void main(String[] args) {
     BSTMap<String, String> a = new BSTMap<String, String>();
     BSTMap<String, Integer> b = new BSTMap<String, Integer>();

     b.put("H", 1);
     b.put("D", 2);
     b.put("I", 3);
     b.put("B", 4);
     b.put("E", 5);
     b.put("A", 6);
     b.put("C", 7);
     b.put("F", 7);
     b.put("G", 7);
     b.put("L", 7);
     b.put("I", 7);
     b.put("J", 7);
     b.put("N", 7);
     b.put("M", 7);
     b.put("O", 7);

     Iterator<String> seer=b.iterator();
     while(seer.hasNext()){
         System.out.println(seer.next());
     }

 }
}
Md Faisal
  • 2,931
  • 8
  • 29
  • 34