二叉树的层次遍历

138 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

二叉树的层次遍历

二叉树的层次遍历过程

一般来说,若二叉树非空,我们可假设它的高度为h,那它的层次遍历的过程如下:

  1. 访问根结点,也就是第一层
  2. 从左到右访问第二层的所有结点
  3. 从左到右访问第h层的所有结点

注:这是一个很好理解的层次遍历,它的遍历过程和我们平时看书一样,从第一行开始从左往右看。

层次遍历算法设计

在二叉树的层次遍历中,对一层的结点访问完后,再按照他们的访问次序对各个结点的左右孩子顺序访问,这样一层一层的进行。这样和队列的先进先出的特点吻合。因此层次遍历采用队列来实现。

  • 代码如下
//*
*先将根结点b进队,在队为非空时进入循环:从队列中出队一个结点p,访问它;若它有左孩子结点,就将左孩子结点入队,若有右孩子结点则右孩子结点也入队,一直循环,知道队空为止
*//
public void LevelOrder(BTreeClass bt){
    BTNode<BTNode> q = new LinkedList<BTNode>();  //定义一个队列q
    //根结点进队
    q.offer(bt.b);
    //队不为空是进入循环
    while(!q.isEmpty()){
    //出队一个结点
        p=q.poll();
        //访问p结点
        System.out.print(p.data+"");
        //左孩子不为空进队
        if(p.lchild!=null)
            q.offer(p.lchild);
            //右孩子不为空进队
        if(p.rchild!=null)
            q.offer(p.rchild);
    }
   
}

注:存储使用链式存储队列,因为我们难以估计要遍历的树有多少个结点。层次遍历算法和先序遍历非递归算法非常的相似,只是前者使用队列,后者使用栈来暂存中间数据,得到不同的结果,也正好体现里栈和队列不同的特点。