【请教】顶级外企的一道面试题:遍历二叉树,要求空间复杂度是个常量,跟树的高度规模等没有关系

xuxichun 2008-03-20 08:30:45
遍历二叉树,要求空间复杂度是个常量,跟树的高度规模等没有关系,
想了很久没想出来,求助~
...全文
1418 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
springtty 2009-03-15
  • 打赏
  • 举报
回复
mark,学习
bazookier 2008-05-07
  • 打赏
  • 举报
回复
是有个父指针的吧。
bazookier 2008-05-07
  • 打赏
  • 举报
回复
是有个父指针的吧。
adderllyer 2008-05-06
  • 打赏
  • 举报
回复
既然“要求空间复杂度是个常量”,那么使用递归方法是行不通的
1楼方法似乎可以
SE_craftsman 2008-03-29
  • 打赏
  • 举报
回复
同意14楼的观点
destinyac 2008-03-28
  • 打赏
  • 举报
回复
收回我说过的话,我没有仔细看1楼的代码。
iceheart 2008-03-28
  • 打赏
  • 举报
回复
一楼方法很巧妙,但并不总能满足需求,比如作为一棵只读的树被多个线程访问就一定会出问题。
另外,这题并没有说必须不能在结构中加一个指向父结点指针吧?
通过一个父结点指针可以很容易解决这个问题.
iceheart 2008-03-28
  • 打赏
  • 举报
回复
一楼方法很巧妙,但并不总能满足需求,比如作为一棵只读的树被多个线程访问就一定会出问题。
另外,这题并没有说必须不能在结构中加一个指向父结点指针吧?
通过一个父结点指针可以很容易解决这个问题.
shshsh_0510 2008-03-27
  • 打赏
  • 举报
回复
换句话说,你需要在不保存全局索引的情况下,判断出你在遍历序下的前进方向
shshsh_0510 2008-03-27
  • 打赏
  • 举报
回复
这个东东需要证明的,用程序恐怕很难说明问题。
比如:1L的算法用到节点指针,当树的规模足够大,你用来存指针的空间肯定不是常数阶的。
mathe 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 download_destiny_AC 的回复:]
1楼的回答不合题意啊。。。
非递归二叉树,其使用的空间还是跟树的高度有关系的。
因为你在搜索过程中要保存节点,而需要保存的节点的个数《=树的高度。
-----------------------------------------------------
题目说的有点不清楚,没有说二叉树是什么形式的,用什么形式存储的。
如果二叉树是线索二叉树,可以在空间复杂度是O(1)遍历完。
[/Quote]
1L并没有保存什么节点呀?
1L已经满足要求了。
当然neglected的方法不行,添加了一个visited域,这是O(n)的空间复杂度
neglected 2008-03-26
  • 打赏
  • 举报
回复
不好意思,上面表达有点错,改成:

访问节点 *node 时候的步骤是:


1.p=node // p空就访问完了

2.用q来寻找p->left为根的最右下端(不包括线索)的节点(nr), //p->left不空 ,为空就不用执行这一步
如果nr访问过 visit=-1 否则visit=-2,
同时nr->right = p->right


3.没访问过就访问,同时visit=1 p=p->left //p->left不空
如果访问过,p=p->right //说明在原来的二叉树中以p为根的树的左子树全部访问过了

4.重复上述步骤。
neglected 2008-03-26
  • 打赏
  • 举报
回复
mathe(数学家就是不一样!!!)

我仔细想了想 不用visit也可是实现,还是那样,线索化的变形:

访问节点 *node 时候的步骤是:


1.p=node // p空就访问完了

2.如果p->left空,p=p->right,执行1
否则 执行3

3. 访问*p;
用q来寻找p->left为根的最右下端的节点(nr),
nr->right = p->right

4. p=p->left;

5.重复上述步骤。

neglected 2008-03-26
  • 打赏
  • 举报
回复
我的想法:不知道行不行(请大牛们给点建议)



struct
{
data;
visit;//1表示访问过了,0表示没有访问过,-1表示访问过了并且*right是线索,
-2表示没有访问过,但*right是线索(先序只有right可能是线索)
*left;
*right;
}

struct *p,*q

我认为这道题其实就是把一个二叉树线索化的过程的变形,
以先序为例,在线索化的过程中,我们使用p保存当前访问的节点,而用q来寻找p->left为根的最右下端(不包括线索)的节点,然后直接把p->right赋给它的right,同时把visit设置为-1或者-2(看是否访问过)


访问节点 *node 时候的步骤是:
1.p=node,没访问过就访问,同时visit=1

用q来寻找p->left为根的最右下端(不包括线索)的节点(nr), //p->left不空
如果nr访问过 visit=-1 否则visit=-2,
同时nr->right = p->right
p=p->left //p->left不空
2. 如果访问过,p=p->right //说明在原来的二叉树中以p为根的树的左子树全部访问过了

3.重复上述步骤。


以上是递归的步骤。
ptwcj 2008-03-25
  • 打赏
  • 举报
回复
mark
njwangchuan 2008-03-23
  • 打赏
  • 举报
回复
栈结构需要log2(h)的额外空间
destinyac 2008-03-22
  • 打赏
  • 举报
回复
1楼的回答不合题意啊。。。
非递归二叉树,其使用的空间还是跟树的高度有关系的。
因为你在搜索过程中要保存节点,而需要保存的节点的个数《=树的高度。
-----------------------------------------------------
题目说的有点不清楚,没有说二叉树是什么形式的,用什么形式存储的。
如果二叉树是线索二叉树,可以在空间复杂度是O(1)遍历完。
jieao111 2008-03-22
  • 打赏
  • 举报
回复
阿诺的女朋友还真pl
matchboy 2008-03-21
  • 打赏
  • 举报
回复
mark
无病呻吟2 2008-03-21
  • 打赏
  • 举报
回复
mark
加载更多回复(1)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧