protected int getHeightI(Node node)
        {
            if (node == null)
            {
                return(-1);
            }

            cQueue q      = new cQueue();
            int    height = 0;

            // adding nodes in level order
            q.enqueue(node);
            q.enqueue(null); // adding null as marker

            while (!q.isEmpty())
            {
                Node n = (Node)q.dequeue();

                if (n == null)
                {
                    // reached end of the current Level

                    // add null if there are more levels
                    if (!q.isEmpty())
                    {
                        q.enqueue(null);
                    }

                    height++;
                }
                else
                {
                    // if not null than add the
                    // children of extracted node

                    if (n.left != null)
                    {
                        q.enqueue(n.left);
                    }
                    if (n.right != null)
                    {
                        q.enqueue(n.right);
                    }
                }
            } // while(!q.isEmpty())

            return(height);
        }
        protected void LevelOrderI()
        {
            // requires Queue data structure
            Node curr = getRoot();

            if (curr == null)
            {
                return;
            }

            cQueue q = new cQueue();

            q.enqueue(curr);

            while (!q.isEmpty())
            {
                curr = (Node)q.dequeue();
                Console.Write("{0} ", curr.val);

                if (curr.left != null)
                {
                    q.enqueue(curr.left);
                }
                if (curr.right != null)
                {
                    q.enqueue(curr.right);
                }
            }
        }