从上往下打印二叉树这个是不分行的,用一个队列就可以实现

class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
queue<TreeNode* > container;
if(root == NULL)
return result;
container.push(root);
while(container.size() != ){
TreeNode* rot = container.front();
container.pop();
if(rot->left != NULL)
container.push(rot->left);
if(rot->right != NULL)
container.push(rot->right);
result.push_back(rot->val);
}
return result;
}
};

leetcode102题是分行打印的,相对于直接从上往下打印,需要把每行表示出来。同样利用队列,但是需增加两个变量来统计分行的信息。

注意一个细节:if(node->left != NULL)  与 if(!node->left) 不一样,即if(!node->left)中感叹号!的优先级高于->left

class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(!root)
return result;
vector<int> res;
queue<TreeNode*> container;
container.push(root);
int now = ;
int next = ;
while(!container.empty()){
TreeNode* node = container.front();
container.pop();
res.push_back(node->val);
now--;
if(node->left != NULL){
container.push(node->left);
next++;
}
if(node->right != NULL){
container.push(node->right);
next++;
}
if(now == ){
now = next;
next = ;
result.push_back(res);
res.clear();
}
}
return result;
}
};

打印多行的另一种写法,个人觉得这种写法比较简洁,少两个变量

class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(root == NULL)
return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> res;
for(int i = q.size();i > ;i--){
TreeNode* node = q.front();
q.pop();
res.push_back(node->val);
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
result.push_back(res);
}
return result;
}
};

leetcode107与102差不多,都是按行打印,但是107是从底层打印到高层。实际代码中,依旧是正常打印,只是在最后输出时用insert进行逆序就好了

class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
if(root == NULL)
return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> res;
for(int i = q.size();i > ;i--){
TreeNode* node = q.front();
res.push_back(node->val);
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
result.insert(result.begin(),res);
}
return result;
}
};

在102和107中,自己都写了一种错误写法,比如102的错误写法如下:

class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
if(root == NULL)
return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> res;
for(int i = ;i < q.size();i++){
TreeNode* node = q.front();
res.push_back(node->val);
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
result.insert(result.begin(),res);
}
return result;
}
};

错误如下:

输入是:[3,9,20,null,null,15,7]

正确输出是:[[3],[9,20],[15,7]]

实际的错误输出是:[[3,9],[20,15],[7]]

主要错误是在for循环当中,for循环的截止条件是<q.size(),这个q的size在每次循环中是变化的,但是实际上我只想要初始的size,这个size表达的是同一层有多少个的节点

注意:for循环中,初始化是只是第一次计算,但是循环判断条件,每次循环都要重新计算

这也是bug的原因所在

103. Binary Tree Zigzag Level Order Traversal(剑指offer之字型打印)

注意:第一行先放左后放右,第二行是先放右后放左。用两个堆进行实现。

class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
vector<int> res;
if(root == NULL)
return result;
stack<TreeNode*> sta1;
stack<TreeNode*> sta2;
sta1.push(root);
int next = ;
while(!sta1.empty() || !sta2.empty()){
if(next % == ){
TreeNode* node = sta1.top();
res.push_back(node->val);
sta1.pop();
if(node->left)
sta2.push(node->left);
if(node->right)
sta2.push(node->right);
if(sta1.empty()){
next++;
result.push_back(res);
res.clear();
}
}
else{
TreeNode* node = sta2.top();
res.push_back(node->val);
sta2.pop();
if(node->right)
sta1.push(node->right);
if(node->left)
sta1.push(node->left);
if(sta2.empty()){
next++;
result.push_back(res);
res.clear();
}
}
}
return result;
}
};

剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)的更多相关文章

  1. 剑指Offer 从上往下打印二叉树(dfs)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...

  2. 剑指offer——从上往下打印二叉树

    题目描述:从上到下打印二叉树的节点,同一层的从左到右打印 思路:采用队列来存储单层的节点,然后通过删除队列的头结点操作,依次遍历每一层. 代码为: import java.util.ArrayList ...

  3. 用js刷剑指offer(从上到下打印二叉树)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 牛客网链接 js代码 /* function TreeNode(x) { this.val = x; this.left = null ...

  4. 剑指Offer-22.从上往下打印二叉树(C++/Java)

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...

  5. 剑指offer--29.从上往下打印二叉树

    层序遍历,队列 ------------------------------------------------------------------------------------- 时间限制:1 ...

  6. 剑指offer23 从上往下打印二叉树

    没有把队列的头部弹出,出现内存错误:

  7. [剑指Offer]8-二叉树的下一个节点

    链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...

  8. LeetCode ZigZag Conversion(将字符串排成z字型)

    class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...

  9. 【读书笔记】剑指offer

    导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https: ...

随机推荐

  1. T-SQL :联接查询练习 (杂)

    1.每个客户返回一行订单 日期在~到~之间 SELECT E.empid, , ') AS dt FROM HR.Employees AS E CROSS JOIN Nums AS D ORDER B ...

  2. Java 快速排序法 冒泡排序法 选择排序法 插入排序法

    1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...

  3. Matlab adaptive quadrature

    % script to perform adaptive quadrature clear all, close all global pts % function to be integrated ...

  4. C#多线程——同步

    多个线程(不仅仅局限于相同进程)如果需要访问相同的可变资源的话就可能需要考虑到线程同步的手段.CPU的线程和进程管控我这里就不去说了,计算机组成原理里面的东西 那么既然要让线程的步调一致,那么我们首先 ...

  5. 【代码笔记】Web-JavaScript-JavaScript注释

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. 【读书笔记】iOS-深入解剖对等网络

    协议本身是一个运行在UDP之上的定制协议.我所以决定使用一个定制协议很简单.首先,当前这个任务看起来足够简单,因此与尝试改进一个现在协议相比,直接构建一个定制协议更为容易.其次,定制协议可以将开销减少 ...

  7. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  8. Python 基于Python实现批量创建目录

    基于Python实现批量创建目录 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   代码实践 #!/usr/bin/env python # -*- cod ...

  9. Android系统启动流程(一)解析init进程启动过程

    整体流程大致如下:     1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...

  10. (网页)angularjs中的interval定时执行功能(转)

    转载博客园魔豆: 一个例子,用来显示当前实时时间,1秒钟刷新一次: <!DOCTYPE html> <html ng-app="myApp"> <he ...