leiyahui

纸上得来终觉浅,绝知此事要躬行
二叉树的遍历

对于一颗一般的二叉树来说一般由一下三部分组成

   
左节点   右节点

显然它很符合递归的定义,即左右子树同样是二叉树

设D 表示对根节点的访问,L表示对左子树的访问,R表示对右子树的访问

一般有一下几种访问方式

1前序遍历方式

(1)先访问根节点 D

(2)遍历左子树 L 

(3)遍历右子树 R

2 中序遍历规则

 (1)先访问左子树L

(2)在访问中子树 D

(3)再访问右子树R

3后序遍历规则

(1)先访问左子树

(2)然后访问右子树

(3)最后访问后子树

二叉树的遍历可以理解为对层次结构模型的数据结构按照一定规则线性化。得到一个类似线性表的序列

对每个节点P的访问调用Visit(p)进行,以上三种方法对应的递归算法如下

void PreOrder(BTptr T)    //先序
{
    if(T)
    {
        Visit(T);
        PreOrder(T->LChild);
        PreOrder(T->RChild);
    }
}
void InOrder(BTptr T)  //中序
{
    if(T0)
    {
        InOrder(T->LChild);
        Visit(T);
        InOrder(T-RChild);
    }
}
void PostOrder(BTptr T)  //后序
{
    if(T)
    {
        PostOrder(T-LChild);
        PostOrder(T->RChild);
        Visit(T);
    }
}

按照层次遍历二叉树

除了上述三种方式之外还有一种遍历的方式,就是按照层次进行遍历,先遍历二叉树的第一层,然后是第二层,,,,一直到第n层。

这个要用到队列技术,当一个节点子节点存在时,这个子节点的指针要进入队列中,以便获取下一层元素。

下面是实现

void LayOerder(BTptr T)
{
    if(T)
    {
        BTptr p;
        ClearQueue(Q);
        Enqueue(T);
        while(!EmptyQueue(T))
        {
            p=DeQueue(Q);
            Visit(p);
            if(p->LChild)
            {
                Enqueue(Q,p->LChild);
            }
            if(p->RChild)
            {
                Enqueue(Q,p->RChild);
            }
        }
    }
}

posted on 2015-11-22 14:48  雷大叔  阅读(199)  评论(0)    收藏  举报