题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了。

先参考milolip的代码,写出这样的solution:


class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot==NULL){
return res;
} queue<TreeNode*> Q;
Q.push(pRoot);
Q.push(NULL);
vector<int> v;
v.push_back(pRoot->val);
res.push_back(v);
v.clear();
while (!Q.empty()){
TreeNode* node = Q.front();
Q.pop();
if (node != NULL){
//v.push_back(node->val);
//cout << node->val << ends;
if (node->left){
Q.push(node->left);
v.push_back(node->left->val);
}
if (node->right){
Q.push(node->right);
v.push_back(node->right->val);
}
}
else if (!Q.empty()){
//cout << "test " << endl;
Q.push(NULL);
res.push_back(v);
v.clear();
//cout << endl;
}
}
return res;
}
};

上面的代码并不太简洁的样子。

另一种写法是从评论区copy来的,又简洁,又非常直观清晰。两层while的嵌套,正好对应到数的层次遍历以及层内逐点遍历。而这种双层嵌套的循环其实并没有增加复杂度,和原来的复杂度是一样的。

class Solution_11 {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res; if (pRoot == NULL){
return res;
} queue<TreeNode*> q;
q.push(pRoot); while (!q.empty()){
int lo = 0, hi = q.size();
vector<int> v;
while (lo++ < hi){
TreeNode *t = q.front();
q.pop();
v.push_back(t->val);
if (t->left){
q.push(t->left);
}
if (t->right){
q.push(t->right);
}
}
res.push_back(v);
}
return res;
}
};

测试代码;

void main_solution_11(){
Solution_11 s = Solution_11();
TreeNode* a = new TreeNode(8);
TreeNode* b1 = new TreeNode(6);
TreeNode* b2 = new TreeNode(10);
TreeNode* c1 = new TreeNode(5);
TreeNode* c2 = new TreeNode(7);
TreeNode* c3 = new TreeNode(9);
TreeNode* c4 = new TreeNode(1); a->left = b1;
a->right = b2; b1->left = c1;
b1->right = c2;
b2->left = c3;
b2->right = c4; vector<vector<int> > q = s.Print(a);
for (int i = 0; i < q.size(); i++){
for (int j = 0; j < q[i].size(); j++){
if (j > 0){
cout << " ";
}
cout << q[i][j];
}
cout << endl;
}
} int main(){
main_solution_11();
return 0;
}

最新文章

  1. 如何设置Vimrc
  2. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4
  3. IIS发布文件出现:未能加载文件或程序集“xxxx”或它的某一个依赖项。试图加载格式不正确的程序。
  4. 一个简单的Windows下的socket程序
  5. php protected封装
  6. 关于html标签和属性的基本理解
  7. 利用css3实现超出文本指定行数与省略号效果
  8. 同一个tomcat多个web应用共享session
  9. Xcode:只修改 Bundle Identifier,不修改项目名
  10. Razor视图引擎基础语法
  11. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别
  12. 前端到后台ThinkPHP开发整站(1)
  13. win7 telnet命令无法开启的解决方案(不是内部命令或外部命令)
  14. Arcgis瓦片--js客户端加载
  15. PAT 乙级 1091 N-自守数 (15 分)
  16. 校内模拟赛 旅行(by NiroBC)
  17. leetcode ex3 找出穿过最多点的直线 Max Points on a Line
  18. nRF51 DK : nRF51822 Development Kit for Bluetooth Smart, ANT and 2.4GHz applications.
  19. JAVA-JSP内置对象之session范围
  20. POJ 1170 Shopping Offers(完全背包+哈希)

热门文章

  1. rabbitmq用户授权
  2. POJ - 2031 Building a Space Station(计算几何+最小生成树)
  3. HDU - 4333 Revolving Digits(扩展KMP)
  4. UVALive - 7639 G - Extreme XOR Sum(思维)
  5. JavaScript之创建动态脚本
  6. [转]xargs命令详解,xargs与管道的区别
  7. JS实现随机背景图片与图片大小变换的效果
  8. 如何用MoveIt快速搭建机器人运动规划平台?
  9. numpy中 array数组的shape属性
  10. VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)