在写的时候可以先写下以下算法,然后将其转化为代码
先序
1.访问p节点
2.节点入栈
3.p=p->Lchild
4.访问p
5.压栈p
6..p=p->Lchild
7.p不为空 goto step 2
8.栈不为空,弹栈p,否则goto step 10
9.p=p->Rchlid,goto step 4
10.结束
void PreOreder(Node *bt)
{
Node *tree=bt;
Stack s;
while(1)
{
while(tree!=NULL)
{
visit(tree);
s.PushIn(tree);
tree=tree->Lchild;
}
if(s.isEmpty())
break;
tree=s.Pop();
tree=tree->Rchild;
}
}
中序遍历和先序遍历的差不多,只是把访问节点的位置改了,在每次弹栈后说明该节点的右子树已经访问完,可以访问以该节点了
void InOreder(Node *bt)
{
Node *tree=bt;
Stack s;
while(1)
{
while(tree!=NULL)
{
s.PushIn(tree);
tree=tree->Lchild;
}
if(s.isEmpty())
break;
tree=s.Pop();
visit(tree);
tree=tree->Rchild;
}
}
后序遍历和先序与中序稍有不同,一个节点一旦其右孩子被访问下一个访问的就是他自己,也就是说一旦一个节点被访问,他又是父节点的右孩子就会连续的弹栈访问
void PostOrder(Node *bt)
{
Node *tree=bt;
Node *q=NULL;
Stack s;
while(1)
{
while(tree!=NULL)
{
s.PushIn(tree);
tree=tree->Lchild;
}
if(s.isEmpty())
break;
tree=s.GetTop();
if(tree->Rchild==NULL||tree->Rchild==q)
{
tree=s.Pop();
visit(tree);
q=tree;
tree=NULL;
}
else
tree=tree->Rchild;
}
}