在电话面试中,我被要求使用迭代器和栈(非递归)实现二叉搜索树的中序遍历。我不允许使用父指针。以下是给出的起始代码。
我被要求在上述代码中实现
然而,在面试之后,我认为即使我们只需要存储父节点(而不是叶节点),它仍然是O(N)。确切地说,是O(N/2),但仍然是O(N)。我认为任何有左孩子的节点都应该存储在栈中。如何不存储?
唯一能实现空间复杂度为O(logN)的情况是二叉树只有一个分支一直向下延伸(不是具有完整叶子的平衡树)。
我在这里缺少什么?如果有人能解释如何使用此迭代器降低空间复杂度至O(logN),我将不胜感激!
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
、next
和hasNext
。于是我就这样做了。随后的问题是时间复杂度和空间复杂度是什么。我回答说时间复杂度为O(N),空间复杂度为O(N)。然而,面试官说:“你可以将空间复杂度进一步降低到O(log N)。”我问他怎么做,他说:“我们只需要存储父节点。”(可能我听错了,他的口音很重。)我的实现是存储每个有左孩子的节点。我只是简单地接受了他的答案。然而,在面试之后,我认为即使我们只需要存储父节点(而不是叶节点),它仍然是O(N)。确切地说,是O(N/2),但仍然是O(N)。我认为任何有左孩子的节点都应该存储在栈中。如何不存储?
唯一能实现空间复杂度为O(logN)的情况是二叉树只有一个分支一直向下延伸(不是具有完整叶子的平衡树)。
我在这里缺少什么?如果有人能解释如何使用此迭代器降低空间复杂度至O(logN),我将不胜感激!
n
个节点?!! - vish4071