二叉树的遍历:是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且只能访问一次。
两个关键词:访问与次序。
二叉树遍历的方法:
- 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。
- 中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历
根结点的左子树,然后访问根结点,最后中序遍历右字数。
3.后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。
4.层次遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是跟结点开始访问,从上到下一层一层遍历,
在同一层中,按从左到右的一个一个访问。
注意:对于计算机来说,它只有循环,判断 等方式来处理,也就是说,它只会处理线性序列。
然而我们上面提到的四种方法,其实多少在把树中的结点变成某种意义的线性序列,这给程序的实现带来了好处。
前序遍历算法:
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return NULL;
`printf("%c",T->data);`
`PreOrderTraverse(T->lchild);`
`PreOrderTraverse(T->rchild);`
}
中序遍历算法:
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return NULL;
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
后序遍历算法:
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return NULL;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
哪么如何建立一个二叉树呢?
假设二叉树的结点均为一个字符,我们把刚才前序遍历序列 AB#D##C##用键盘按个输入,实现算法如下:
void CreateBiTree(BiTree *T)
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode);
if(!*T)
exit(OVERFLOW);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}