二叉树的遍历

二叉树的遍历(traversing binary tree)是指从根节点触发,按照某种次序依次访问二叉树中的所有结点,使得每个结点都被访问一次且仅被访问一次。

1 先(前)序遍历

若二叉树为空,则空操作返回;否则

(1)访问根节点;

(2)先序遍历左子树;

(3)先序遍历右子树。

《二叉树的遍历》

void PreOrderTraverse(BiPTree T,void(*Visit)(BiPTree))
 { /* 先序递归遍历二叉树T */
   if(T)
   {
     Visit(T); /* 先访问根结点 */
     PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树 */
     PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树 */
   }
 }

2 中序遍历

若二叉树为空,则空操作返回;否则

(1)中序遍历左子树;

(2)访问根节点;

(3)中序遍历右子树。

《二叉树的遍历》

void InOrderTraverse(BiPTree T,void(*Visit)(BiPTree))
 { /* 中序递归遍历二叉树T */
   if(T)
   {
     InOrderTraverse(T->lchild,Visit); /* 中序遍历左子树 */
     Visit(T); /* 再访问根节点 */
     InOrderTraverse(T->rchild,Visit); /* 最后中序遍历右子树 */
   }
 }

3. 后序遍历

若二叉树为空,则空操作返回;否则

(1)后序遍历左子树;

(2)后序遍历右子树;

(3)访问根节点。

《二叉树的遍历》

void PostOrderTraverse(BiPTree T,void(*Visit)(BiPTree))
 { /* 后序递归遍历二叉树T */
   if(T)
   {
     PostOrderTraverse(T->lchild,Visit); /* 后序遍历左子树 */
     PostOrderTraverse(T->rchild,Visit); /* 后序遍历右子树 */
     Visit(T); /* 最后访问根节点 */
   }
 }

4. 层序遍历

若二叉树为空,则空操作返回;否则

从树的第一层,从上而下逐层遍历,在每一层中,按照从左到右的顺序逐个访问结点。

《二叉树的遍历》

二叉树的层序遍历也就是二叉树的广度优先遍历。

算法思想:

1初始化一个队列,并把根结点入列队;

2当队列为非空时,循环执行步骤3到步骤5,否则执行步骤6;

3出队列取得一个结点,访问该结点;

4若该结点的左子树为非空,则将该结点的左子树入队列;

5若该结点的右子树为非空,则将该结点的右子树入队列;

6结束。

void LevelOrderTraverse(BiPTree T,void(*Visit)(BiPTree))
 { /* 层序遍历二叉树T(利用队列) */
   LinkQueue q;
   QElemType a;
   if(T)
   {
     InitQueue(&q);
     EnQueue(&q,T);
     while(!QueueEmpty(q))
     {
       DeQueue(&q,&a);
       Visit(a);
       if(a->lchild!=NULL)
         EnQueue(&q,a->lchild);
       if(a->rchild!=NULL)
         EnQueue(&q,a->rchild);
     }
   }
 }

Reference:

[1] 《大话数据结构》

[2] 《数据结构 严蔚敏》

[3] wikipedia(二叉树):http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91

[4] wikipedia(广度优先搜索):

http://zh.wikipedia.org/wiki/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2

[5] 博客园(二叉树的深度优先遍历、广度优先遍历和非递归遍历)

 

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/zhuyf87/archive/2012/11/03/2752157.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞