二叉树的遍历包括前序遍历、中序遍历、后序遍历三种基本方式,
概念
二叉树的遍历: 是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
遍历规则:
先序遍历: 优先输出根节点,而后遍历左子树,最后右子树;
中序遍历: 首先遍历左子树,而后访问根节点,再遍历右子树;
后序遍历:先后序遍历右子树,而后左子树,最后访问根节点。
性质:
- 已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
- 已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
二叉树的结点类
struct BinaryTreeNode {
int val;
BinaryTreeNode* leftchild;
BinaryTreeNode* rightchild;
BinaryTreeNode(int const& _val, BinaryTreeNode* _leftchild=NULL, BinaryTreeNode* _rightchild=NULL) :
val(_val), leftchild(_leftchild), rightchild(_rightchild) {
}
};
遍历方法有两种,一种是递归遍历,一种是非递归遍历,所以接下来每种遍历方法我都会分两种情况进行说明。
递归遍历
首先是递归遍历方法,这种方法只需要熟记三种遍历方法的规则,而后依次递归输出就可以了^ v ^
先序遍历
void PreOrderTraverse(BiTree *T)
{
if(!T.empty()){
cout<<T->ch<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
中序遍历
void InOrderTraverse(BiTree *T)
{
if(!T.empty()){
PreOrderTraverse(T->lchild);
cout<<T->ch<<" ";
PreOrderTraverse(T->rchild);
}
}
后序遍历
void PostOrderTraverse(BiTree *T)
{
if(!T.empty()){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout<<T->ch<<" "