二叉树的层次遍历(队列实现)
层次遍历的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的位置上
- 把根结点读出,dequeue出列,把左右孩子的指针入列到1和2的位置
- 从表头读取,首先是左孩子,然后dequeue把左孩子出列,把左孩子的左右孩子入列。再是读取右孩子,然后dequeue出列,把右孩子的左右孩子入列。
- 如此反复就可以层次遍历整个二叉树了。