二叉树的层序遍历--队列的使用

leetcode上对应习题序号

102,103,107,119

make_pair<Treenode *,int>存储当前结点和结点所在的层数


层序遍历,顾名思义,就是每次打印一行,这一行代表当前树的一层,如果按照普通要求,就是把每个节点值按照层序从上到下从左到右依次输出,那么为什么会选择队列来保存结点呢

头节点放进队列中,队列不为空,然后对队列中的元素依次进行操作

rel.push——back(root)

while (!rel.empty())

BinaryTree* front = rel.front();

然后对这个front操作,再把该节点的左右结点放进队列中

其中队列直接保存的是二叉树结点指针 queue<BinaryTree*> rel

而对于希望以特殊方式打印出来的,采取如下方法

改变在于队列存储的是一对元素,分别是树节点指针,和该节点对应所在层次level,每次对队列头操作pop和赋值的时候,都把它的左右节点都放入队列中

先进先出,后今后出。 Treenode *node=q.front().first;

  int  level=q.front().second;

当然还得判断res数组当前的层次是否等于队列pop元素的,如果res的size==level,说明这个level的值还没存进去

总之,是这样一个操作过程

首先,结果数组res--第一个值对应level,这一行存的就是这层的树节点值

队列q--pair值,树节点指针,和该节点的层

把二叉树头节点存进去,并把该节点赋值给res,注意在这个过程中,res的数组大小要扩展

每次再队列中pop一个元素,都要把该节点的左右结点都放进去,

其实我觉得可以先把树节点信息全部放进队列中,然后再把队列元素的pop()出来,给res


struct Treenode
{
 int val;
 Treenode *left;
 Treenode *right;
 }


vector<vector<int> >P(Treenode *root)
{
 Queue<pair<Treenode*,int> >q;
 q.push_back(make_pair(root,0));
 vector<vector<int> >res;
 while(!q.empty())
 {
  Treenode *node=q.front().first;
  int  level=q.front().second;
  q.pop();
  if(leve==res.size())
  res.push_back(vector<int> )
res[level].push_back(node->val);
return res;  
 node是循环的关键
 if(node->left)
 q.push_back(make_pair(h->left,level+1));
 if(node->right)
 q.push_back(make_pair(h->right,level+1));
 }

还有一种方法:

循环里边是当前树的层次里边的结点,因为pop之后,每一次存储的是当前层次的结点


1 class Solution

2 {

3 public:

4 vector<vector<int> > levelOrderBottom(TreeNode *root)

5 {

6 vector<vector<int> > vvi;

7

8 if(NULL == root)

9 return vvi;

10

11 queue<TreeNode *> q;

12 q.push(root);

13 while(!q.empty())

14

{

15 vector<int> vi;

16 for(int i = 0, n = q.size(); i < n; ++ i)

17

{

18 TreeNode *temp = q.front();

19 q.pop();

20 if(temp -> left != NULL)

21 q.push(temp -> left);

22 if(temp -> right != NULL)

23 q.push(temp -> right);

24 vi.push_back(temp -> val);

25 }26

vvi.push_back(vi);

27 }

28 reverse(vvi.begin(), vvi.end());

29 return vvi;

30 }

31 };

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值