概述:我们把图形的方式来表现树的结构,
对于我们来说是非常直观的,
但是对于计算机来说,它只有循环,
判断等方法来处理,也就是说它只会处理线性的序列,
而我们讲的二叉树的遍历就是把树中的结点变成某种意义上的线性序列。
一
定义:二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。
注意:每个结点仅被访问一次。
二
遍历方式(4种)
(1)前序遍历(根左右)
说明:根据口诀,首先是根(A),然后是左子树(即结点A的左子树BDFE),然后到右子树(结点A的右子树,即CGIH),注意,这里遍历到左子树的时候,B结点同样成为根节点,然后到结点B的左子树(D),然后到结点B的右子树(F,这里F有称为根节点,E是结点F的左子树)。其实这就是一个递归的过程。
代码实现:(由于二叉树的定义本身就是一个递归的过程,所以代码的原理就是一个递归的过程)
void PreOrderTraverse(BiTree* T)
{
if(T==NULL)
return;
printf("%c",T->data);//输出结点的数据
PreOrderTraverse(T->lchild);//遍历左子树
PreOrderTraverse(T->rchild);//遍历右子树
}
前序遍历结果为:ABDFECGHI
(2)中序遍历(左根右)
说明:这里D结点没有左子树和右子树,为了更直观的看到遍历结果,我们可以假想它有左子树和右子树。这样,可以在最终的遍历结果时去掉假想有的结点就可以了。
//代码实现(中序遍历算法)
void PreOrderTraverse(BiTree* T)
{
if(T==NULL)
return;
PreOrderTraverse(T->lchild);//遍历左子树
printf("%c",T->data);//输出结点的数据
PreOrderTraverse(T->rchild);//遍历右子树
}
中序遍历结果为:DBEFAGHCI
(3)后序遍历(左右根)
说明:这里也一样,在遇到难以判断遍历顺序的二叉树时,为了更直观的看到遍历结果,我们可以假想所有结点都有左子树和右子树。这样,可以在最终的遍历结果时去掉假想有的结点就可以了。
//代码实现(后序遍历算法)
void PreOrderTraverse(BiTree* T)
{
if(T==NULL)
return;
PreOrderTraverse(T->lchild);//遍历左子树
PreOrderTraverse(T->rchild);//遍历右子树
printf("%c",T->data);//输出结点的数据
}
后序遍历结果:DEFBHGICA
(4)层序遍历
层序遍历就比较简单了,简单来说就是一层一层来遍历。从左到右,从上到下。
层序遍历结果:ABCDFGIEH
三
二叉树遍历的性质:
(1)已知二叉树的前序遍历和中序遍历,可以唯一确定一颗二叉树。
(2)已知二叉树的后序遍历和中序遍历,可以唯一确定一颗二叉树。
(3)已知二叉树的前序遍历和后序遍历,不能唯一确定一颗二叉树。
(这里,大家可以举一个具有3个结点的二叉树进行自行推导)
参考:https://www.cnblogs.com/du001011/p/11229170.html