public static  void travelPreOrder(int depth, int nodeID){
        if( depth<=0 || depth >32 ) return;

        long bound = (1<<(depth+1)) - 2;
        if( nodeID>= bound ) return;

        int level = getNodeLevel(nodeID);

        Stack<Long> st = new Stack<Long>(depth -level +4);

        long index = nodeID;
        do {
            if( index<bound ){
                System.out.print(index + " ");
                index = 2*index+2;  //goto left child.
                st.Push(index+1);   //right child into stack
            } else if( !st.isEmpty()){ // index >=bound!
                index = st.Pop();
            } else{// stop now!
                break;
            }
        }while(true);
    }