严蔚敏版数据结构错误还是我的错误?

laraya 2008-11-28 09:09:23
在数据结构版面发了,那里人气不行,没人解答,特在此求解
二叉树那章,第131页书的原话这样:
不论按那一种次序进行遍历,对含n个节点的二叉树,其时间复杂度均为O(n)。所需辅助空间为遍历过程中栈的最大容量,即树的
深度,最坏情况下为n,则空间复杂度也为O(n)。
其中我觉得有错误的是这句话:最坏情况下为n,
事实上如果按先序非递归遍历时候,利用栈,我们在算法上能做到栈的最大容量只需要二叉树的深度减去1,即最坏情况下为n-1;
大家说是这样吗?
下面给出算法源代码:
int ndpreorder2(bitree t)//这个算法比上算法好,栈只入右节点,而且所需的栈空间也比上面要小
{
int m=0;
seqstack *s;
bitree p;
p=t;
s=initseqstack();
while(p!=null || emptyseqstack(s)==0)
{
while(p!=null)
{
printf("%d ",p->data);
if(p->rchild!=null)
{push(s,p->rchild);m++;}
p=p->lchild;
}
if(emptyseqstack(s)==0)
p=pop(s);
}
return m;
}
m用来计算入栈次数,此时栈中只入所有的右孩子,这个不是需要讨论的,
讨论的主要问题在于栈所需要的最大容量,
我认为最坏情况下是左单支树,并且该树每个节点都有个右孩子,
例如这样的二叉树,它的先序序列为:
1 2 3 4 5 6 7
中序序列为:
4 3 5 2 6 1 7
此时二叉树高度为4,但是只需要栈的大小为3即可。
...全文
408 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
laraya 2008-11-28
  • 打赏
  • 举报
回复
答非所问[Quote=引用 9 楼 dalixux 的回复:]
二叉树 先序 中序 后序 遍历 实际上是一样的 遍历 只是对节点处理的时机不同而已

不过严蔚敏的教程看了真的很不适应 明明C算法描述 却喜欢从 1 到i 而不是 0到i-1
[/Quote]
dalixux 2008-11-28
  • 打赏
  • 举报
回复
二叉树 先序 中序 后序 遍历 实际上是一样的 遍历 只是对节点处理的时机不同而已

不过严蔚敏的教程看了真的很不适应 明明C算法描述 却喜欢从 1 到i 而不是 0到i-1
laraya 2008-11-28
  • 打赏
  • 举报
回复
哈哈,
问题是我不确定我的是正确的哈
楼上的好搞笑哦
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
尽信书不如无书
人家unix网络编程的作者无敌状态,现在更加无敌了,因为他已经死了
他的书里面都有很常见的错误
严维敏能跟他比?
出错只要是书就可能
而且他的只是一个算法的设计,小小问题无需太多纠缠哈哈
laraya 2008-11-28
  • 打赏
  • 举报
回复
哎呀
我知道复杂度是没有区别的;
但是如果我说的是正确的话,
那么该书所说的最坏情况下需要栈大小为树高度n就是错误的嘛
至少在先序遍历时候用这个算法就不要那么大的栈空间啊
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复

问题是n和n-100在复杂度上有区别吗?
都是O(N)
如果你用链栈的话根本就不需要分配空间不是吗?
呵呵
laraya 2008-11-28
  • 打赏
  • 举报
回复
我在电脑上不停的修改栈大小
并且建不同的二叉树来实践
我能构造到的最差二叉树用该算法遍历的时候栈也只是需要深度减1的大小
laraya 2008-11-28
  • 打赏
  • 举报
回复
那你能举出一个二叉树例子
我都能用上面的算法只需要深度n减1;
而并非需要深度n
lann64 2008-11-28
  • 打赏
  • 举报
回复
最坏情况是深度就是n
至于是复杂度是n还是n-1,就没必要讨论了,都是O(n)
laraya 2008-11-28
  • 打赏
  • 举报
回复
算法大家可能看的困难,
那上面的栈是我自己电脑上实现的;
emptyseqstack(s)==0是指栈非空。
pop(s)函数出栈,并且函数返回栈顶元素。
s是一个指向顺序栈的指针。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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