java有序二叉树hasnext_算法-使用迭代器和堆栈的二叉搜索树有序...

在电话采访中,我被要求使用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),我将不胜感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值