在电话采访中,我被要求使用Iterator& amp;进行顺序遍历二进制搜索树.堆栈(不是递归的).我不允许使用父指针.
这是我得到的入门代码.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}};
class BTIterator
{
public:
BTIterator(TreeNode *root){
};
TreeNode* next() {
}
bool hasNext() {
}
};
测试功能:
void TestFunc(TreeNode *root) {
BTIterator bti(root);
while(bti->hasNext()) {
cout << bti->next()->val << " ";
}}
我被特别要求实现上述代码中的BTIterator,接下来是hasNext.
所以我做了.
后续问题是什么时间和时间?空间复杂度.
所以我回答时间是O(N),空间是O(N).
但是,面试官说:“您可以进一步降低空间复杂度,
?O(log N)”.我问他怎么做,他说“我们只需要存储父母”(我可能听错了他的话.他的口音很浓.)我的实现是存储每个留有孩子的节点我只是把他的回答视为理所当然.
但是,在面试之后,我认为即使我们只需要存储父级(而不是叶节点),它仍然是O(N).这是precisley O(N / 2),但仍然是O(N).我相信任何留下孩子的节点都应存储在堆栈中.怎么不呢?
唯一可以实现空间O(logN)的时间是二叉树只有一个分支不断下降的情况(而不是带有全叶的平衡树).
我在这里想念什么?如果有人能解释如何将使用迭代器的空间复杂度进一步降低到O(log N),我将不胜感激!