前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。
1.递归实现
void preOrder(BinTree* root)
{
if(root!=NULL)
{
cout<<root->data;
preOrder(root->lchild);
preOrder(root->rchild);
}
}
2.非递归实现(借助栈)
对于任一结点P:
1)访问结点P,并将结点P入栈;
2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;
3)直到P为NULL并且栈为空,则遍历结束。
void preOrder(BinTree* root)
{
stack<BinTree*> s;
BinTree* p=root;
while(p!=NULL || !s.empty())
{
while(p!=NULL)
{
cout<<p->data;
s.push(p);
p=p->lchild;
}
if(!s.emtpy())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
时间: 2024-10-12 07:30:58