二叉树前序遍历:
- 访问根节点;
- 前序遍历根节点的左子树
- 前序遍历根节点的右子树
template<class T>
void Bitree<T>::PreOrder(BiNode<T>*bt)
{
if(bt==NULL)
return;
else{
cout<<bt->data<<endl;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
二叉树中序遍历:
- 中序遍历根节点的左子树
- 访问根节点
- 中序遍历根节点的右子树
template<class T>
void Bitree<T>::InOrder(BiNode<T>*bt)
{
if(bt==NULL)
return;
else{
InOrder(bt->lchild);
cout<<bt->data<<endl;
InOrder(bt->rchild);
}
}
- 后序遍历根节点的左子树
- 后序遍历根节点的右子树
- 访问根节点
template<class T>
void Bitree<T>::PostOrder(BiNode<T>*bt)
{
if(bt==NULL)
return;
else{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<<bt->data<<endl;
}
}
二叉树前序非递归遍历算法:
1.栈s初始化
2.循环直到bt为空且栈s为空
2.1 当bt不空时循环
2.1.1输出bt->data;
2.1.2将指针bt保存到栈中
2.1.3继续遍历bt的左子树
2.2如果栈s不为空
2.2.1将栈顶元素弹出至bt
2.2.2准备遍历bt的右子树
template<class T>
void Bitree<T>::PostOrder(BiNode<T>*bt)
{
stack<BiNode<T>*> s;
while(bt!=NULL||s.size()!=0)
{
while(bt!=NULL)
{
cout<<bt->data<<endl;
s.push(bt);
bt=bt->lchild;
}
if(s.size()!=0)
{
bt=s.top();
s.pop();
bt=bt->rchild;
}
}
}