二叉树的层次遍历(队列实现)

 层次遍历的C++算法代码:(传入的是二叉树的根结点)

 1 template <class Elem>
 2 void level(BinNode<Elem>* subroot) 
 3 {
 4      AQueue<BinNode<Elem>*> Q;
 5      Q.enqueue(subroot);
 6      while(!Q.isEmpty())
 7       {
 8      BinNode<Elem>* temp;
 9           Q.dequeue(temp);  //返回temp指针是Q队列的表头的二叉树中的结点,而temp指针的结点已经被dequeue(出列)
10 if(temp != NULL) 11 { 12 Print(temp); 13 if(temp->left!=NULL) Q.enqueue(temp->left()); 14 if(temp->right!=NULL) Q.enqueue(temp->right()); 15 } 16 } 17 }

用顺序队列来表示队列(即环形)

建立队列的算法代码:

1 AQueue(int sz=DefaultlistSize)
2 {
3     int size =sz+1;
4     rear=0; front=1;
5     listArray=new Elem[size];
6 }

入列的算法代码:

1 bool enqueue(const Elem& it)
2 {
3      if(((rear+2)%size)==front) return false;
4      rear=(rear+1)%size;
5      listArray[rear]=it;
6      return true;
7 }

出列的算法代码:

bool dequeue(Elem&it)
{
     if(length()==0) return false;
     it =listArray[front];
     front=(front+1)%size;
     return true;
}

要想实现层次遍历的话,必须修改各个方块的代码;如
出列时返回表头的二叉树指针。

说明一下层次遍历代码的思想:

用一个队列保存被访问的结点的左右孩子。

     
               
1111111111 2222222222 3333333333 4444444444 5555555555 666666666 777777777 88888888888

如大体的过程:

  1. 根结点入列1的位置上
  2. 把根结点读出,dequeue出列,把左右孩子的指针入列到1和2的位置
  3. 从表头读取,首先是左孩子,然后dequeue把左孩子出列,把左孩子的左右孩子入列。再是读取右孩子,然后dequeue出列,把右孩子的左右孩子入列。
  4. 如此反复就可以层次遍历整个二叉树了。

 

 

 

 

 

posted on 2012-12-02 17:12  Besion王  阅读(2515)  评论(0编辑  收藏  举报

导航