严蔚敏版数据结构错误还是我的错误?
在数据结构版面发了,那里人气不行,没人解答,特在此求解
二叉树那章,第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即可。