学过数据结构我们很容易知道如何进行宽度优先遍历树,那么这道题就是对宽度优先遍历树的算法进行改进。
1
/ \
2 3
/ \ \
4 5 6
/ \
7 8
运用BFS只能输出1,2,3,4,5,6,7,8这个序列,并不知道分层信息,因此如何分层打印呢?
我的方法就是对每一个节点做以下判断,如果该节点在队列中的下一个节点是是NULL说明该节点是树在某一层的最后一个节点,将该节点的子节点输入队列中之后,在输入一个NULL节点。
道理很简单:每一层的最后一个节点其子节点也必须是下一层的最后一个节点。
代码如下:
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode2{
TreeNode2* m_pLeft;
TreeNode2* m_pRight;
int value;
};
void BFSTreeByLayer(TreeNode2* root){
if(!root)
return;
queue<TreeNode2*> q;
q.push(root);
q.push(NULL);
while(!q.empty()){
TreeNode2* tmp = q.front();
q.pop();
if(!tmp){
cout<<endl;
continue;
}
cout<<tmp->value<<' ';
if(tmp->m_pLeft)
q.push(tmp->m_pLeft);
if(tmp->m_pRight)
q.push(tmp->m_pRight);
if(!q.front())
q.push(NULL);
}
}
int main(){
TreeNode2 t8 = {NULL,NULL,8};
TreeNode2 t7 = {NULL,NULL,7};
TreeNode2 t6 = {NULL,NULL,6};
TreeNode2 t5 = {&t7, &t8,5};
TreeNode2 t4 = {NULL,NULL,4};
TreeNode2 t3 = {NULL,&t6,3};
TreeNode2 t2 = {&t4,&t5,2};
TreeNode2 t1 = {&t2,&t3,1};
BFSTreeByLayer(&t1);
system("PAUSE");
return 0;
}