| Overview | Schedule | Resources | Assignments | Home |
This exam is open-book and open-note. Please allow some time to check your work. If you need extra space, write on the back.
tnode class template, which represents a binary tree node
where each node is labeled with a value of type T:
template <typename T>
class tnode {
public:
T nodeValue;
tnode<T> *left, *right;
tnode(const T& item, tnode<T> *lptr = 0, tnode<T> *rptr = 0) :
nodeValue(item), left(lptr), right(rptr) { }
};
Suppose that root points to a binary search tree of ints (ordered by the
usual < relation). Given a function test from int to
bool, write an efficient function with the following prototype:
bool printSmallest(const node<int> *root)which searches for the smallest value
n in the tree such
that test(n) is true. If such an n is found, it
should print n to cout and return true; otherwise,
it should return false and not print anything.
For example, if test(n) returns true when n is
even, and false otherwise, then printSmallest(root) should
print the smallest even number (if any) in the tree pointed to by
root (and return true only if a number was printed).
x is declared as a stack<char>?
x.push('h'); x.push('e'); x.push('l');
cout << x.top(); x.pop();
cout << x.top(); x.pop();
x.push('l'); x.push('o');
cout << x.top(); x.pop();
cout << x.top(); x.pop();
cout << x.top(); x.pop();
What would the output be from the same sequence if x were
declared as a priority_queue<char> (where characters later in
the alphabet have higher priority)?
Finally, what would the output be from the same sequence if x
were declared as a queue<char> and the x.top() operations
were replaced by x.front()?
int countBelow(const vector<int> &v, int n) which will
return the number of items strictly less than n found in the vector
v. You should not assume anything about the ordering of the items
in the vector.
list<int> argument
instead of a vector<int>.
tnode<int> *fibber(int n)
{
if (n <= 1) return 0;
tnode<int> *p = fibber(n - 1);
tnode<int> *q = fibber(n - 2);
return new tnode<int>(n, p, q);
}
Draw the call tree that results from the function call fibber(5).
int a[N] when N is a million; instead, you can declare
a to be an object of class test, and the only space
required on the system stack will be for the data pointer--the
million ints will be allocated from the heap):
const int N = 1000000;
class test {
public:
test() : data(new int[N]) { }
test(const test& x);
~test();
test& operator=(const test& rhs);
int& operator[](int i) { return data[i]; }
const int& operator[](int i) const { return data[i]; }
private:
int *data;
};
test::test(const test& x) : data(new int[N])
{ for (int i = 0; i < N; i++) data[i] = x[i];
}
test::~test()
{ // FINISH THIS:
}
test& test::operator=(const test& rhs)
{ // AND THIS:
}
What will be the output from the following program using this class?
void f(test x, test& y) { x[42] = 2 * y[42]; y = x; }
int main()
{ test a;
a[42] = 17;
test b = a;
f(a, b);
cout << a[42] << " " << b[42] << endl;
}
How many times will the test destructor be called in the above
program?
multiset<string> m;
m.insert("to"); m.insert("be"); m.insert("or");
m.insert("not"); m.insert("to"); m.insert("be");
set<string> s;
multiset<string>::const_iterator it;
for (it = m.begin(); it != m.end(); ++it) {
cout << *it;
pair<set<string>::iterator, bool> p = s.insert(*it);
if (p.second) cout << " inserted" << endl;
else cout << " not inserted" << endl;
}
set<string>::const_iterator sit;
for (sit = s.begin(); sit != s.end(); ++sit) {
cout << *sit << " ";
}
cout << endl;
| Overview | Schedule | Resources | Assignments | Home |
![]()
DePauw University,
Computer Science Department,
Fall 2008
Maintained by Brian Howard
(bhoward@depauw.edu).
Last updated