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

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. SQL查询语句如何能够让指定的记录排在最后

    方法如下:select * from <表名> order by case when <条件> then 1 else 0 end asc 举例:把threads表中列id值小 ...

  2. 【Java基础】9、Enumeration接口和Iterator接口的区别

    package java.util; public interface Enumeration<E> {     boolean hasMoreElements();     E next ...

  3. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  4. 关于Ajax的get与post浅分析,同步请求与异步请求,跨域请求;

    Ajax局部异步刷新全称ASynchronous JavaScript And XML.使用Javascript代码获取服务器的数据,Ajax当中有两个请求方法,一个是get方法,一个是post请求方 ...

  5. Python 线程同步变量,同步条件,列队

    条件变量同步 有一类线程需要满足条件之后才能够继续执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock()的方法外,还提供了 ...

  6. Spark 跑 java 示例代码

    一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...

  7. 深入研究HTML5实现图片压缩上传

    上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...

  8. 腾讯Tars环境搭建 ---- centos

    1,安装git yum install git 2,下载脚本 git clone https://github.com/tangramor/Tars_Install.git 注意:会有3个脚本,cen ...

  9. 启动MySQL报错

    安装完MySQL,启动MySQL报错,报错信息如下:Starting MySQL....The server quit without updating PID file (/data/mysqlda ...

  10. Android Studio_更新Gradle

    一.Gradle更新问题 Android Studio每次更新版本都会更新Gradle这个插件,而且有时候提示更新,却一直更新不了,那是因为中国伟大的长城问题.就是下图,我刚刚更新了,提示更新grad ...