Given a binary tree, return the level order traversal of its nodes‘ values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / 9 20 / 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
思路:本题需要按层从左到右输出每层的结点值,放在一个二维数组中。那么首先可以用二叉树的广度优先算法,将结点按按层排序好,放在一个一维数组中,问题是如何知道数组中的每个点分别是在第几层?
这边需要注意的是,在用广度优先算法的时候,我是将空结点也放进了数组中。即若某结点p的左子树如果为空,则也将指向这颗空子树的指针也放进数组中。
下面来看如何知道数组中每个结点分别是二叉树第几层的结点。
很显然,第一层的结点即是数组中的第一个结点,记为v[0],那么第二层的结点,就是v[1],v[2],第三层就是v[3],v[4],v[5],v[6]。以此类推。
真的就是这么简单,显然不是。上面的这种情况二叉树是满二叉树(即每层结点都是满的),所以如果不是满二叉树,那么又该如何来做呢?
做法就是在遍历每一层的每一个结点时,我们可以记一个数cnt,如果该结点存在,就把cnt = cnt + 2;否则就不需要加2。这样的做法,就可以知道实际的下一层一共有多少个结点。因此,一旦我们知道了下一层的结点总数 (即每一层的结点总数),就可以从数组中容易地区分每个结点在第几层。
我想大致思路应该是讲清楚了。
#include "stdafx.h" #include <vector> #include <queue> #include <iostream> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { vector<vector<int> > vv;//最终的结果,一个二维向量(数组) vector<int> v;<span style="white-space:pre"> </span>//一个存放每层结点元素值的临时向量(不包括空结点) vector<TreeNode*> vt;<span style="white-space:pre"> </span>//这个向量存放到即是每层的结点(包括空结点) queue<TreeNode*> L;<span style="white-space:pre"> </span>//广度优先时,用到的辅助队列 TreeNode* t; int i,j; if(root)<span style="white-space:pre"> </span>//广度优先 { v.push_back(root->val); vv.push_back(v); //这边直接将第一层的结点元素值,放进最终结果了 } L.push(root); while(!L.empty()) { t = L.front(); vt.push_back(t); L.pop(); if(!t) continue; L.push(t->left); L.push(t->right); } int step = 3; int cnt = 0; for(i=1; i<vt.size(); i=j)//从第二层开始 { v.clear();<span style="white-space:pre"> </span>//清空<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">存放每层结点元素值的临时向量</span> for(j=i; j<vt.size() && j<step; ++j) { if(vt[j])//不是空结点,则将结点元素值放入临时向量中,并将计数值+2 { v.push_back(vt[j]->val); cnt+=2; } } step = j+cnt;//下一层的实际结点树 cnt = 0;<span style="white-space:pre"> </span>//计数值清零 if(!v.empty()) vv.push_back(v);//每一层实际结点元素值,放入最终结果向量中 } return vv; } };
LeetCode | Binary Tree Level Order Traversal
原文地址:http://blog.csdn.net/dream_whui/article/details/44902175