二叉树的遍历

来源:互联网 发布:网络于刷脸是什么字 编辑:程序博客网 时间:2024/06/17 09:19

二叉树的遍历:是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且只能访问一次。

两个关键词:访问与次序。

二叉树遍历的方法:

  1. 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。
  2. 中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历
    根结点的左子树,然后访问根结点,最后中序遍历右字数。
    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);
}
}

0 0
原创粉丝点击