编程之美——3.10 分层遍历二叉树

学过数据结构我们很容易知道如何进行宽度优先遍历树,那么这道题就是对宽度优先遍历树的算法进行改进。

         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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值