这个是什么思路啊,遍历树的时候

liuzu2012 2012-06-04 07:56:37


这个非递归的算法前序遍历不好理解啊
这是来自网上。不好理解
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;

do
{
while (p!=null) //遍历左子树
{
x.ptr = p;
x.tag = L; //标记为左子树
push(s,x);
p=p->lchild;
}

while (!StackEmpty(s) && s.Elem[s.top].tag==R)
{
x = pop(s);
p = x.ptr;
visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
}

if (!StackEmpty(s))
{
s.Elem[s.top].tag =R; //遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while (!StackEmpty(s));
}//PostOrderUnrec



我的思路是:始终不要把跟节点存到栈中,取出根节点,则立即 把子右树,左子树压入,如果是叶子节点,则退出。
statck<BitNood*> s;
s.push_back(root);
while(!s.empty())
{
BitNood* p=s.top();
s.pop_back();

if(p->right)
{

s.push(p->right);

}
if(p->left)
{
s.push(p->left);
}
}


这是我提供的伪代码, 觉得没有问题,不知道如何理解 网上的那个思路
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AndyZhang 2012-06-04
  • 打赏
  • 举报
回复
数据结构上有例子,找本数据结构的书看一下便明白了
angel_su 2012-06-04
  • 打赏
  • 举报
回复
PostOrderUnrec按名字貌似是后续遍历来的,你想的是前序遍历,两者出入栈的方式有差别...
liuzu2012 2012-06-04
  • 打赏
  • 举报
回复
我的跟正一下
stl版本不对

statck<BitNood*> s;
s.push_back(root);
while(!s.empty())
{
BitNood* p=s.top();
cout<<p->data;
s.pop();

if(p->right)
{

s.push(p->right);

}
if(p->left)
{
s.push(p->left);
}
}







[Quote=引用楼主 的回复:]
C/C++ code


这个非递归的算法前序遍历不好理解啊
这是来自网上。不好理解
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;

do
{
while (p!=null) //遍历左子树
……
[/Quote]
quwei197874 2012-06-04
  • 打赏
  • 举报
回复
void PreTree(bitree T)
{
bitree p,node[20];
int top=0;
p=T;
do
{
while(p!=NULL)
{
cout<<p->data<<" ";
node[top]=p;
top++;
p=p->lchild;

}
if(top>0){top--;p=node[top];p=p->rchild;}
}while(top>0||p!=NULL);
cout<<endl;

}

W170532934 2012-06-04
  • 打赏
  • 举报
回复
我觉得你的第一个好像是错误的呢。你自己的好像也有错误。

69,336

社区成员

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

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