剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)
从上往下打印二叉树这个是不分行的,用一个队列就可以实现
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(剑指之字型打印)的更多相关文章
- 剑指Offer 从上往下打印二叉树(dfs)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...
- 剑指offer——从上往下打印二叉树
题目描述:从上到下打印二叉树的节点,同一层的从左到右打印 思路:采用队列来存储单层的节点,然后通过删除队列的头结点操作,依次遍历每一层. 代码为: import java.util.ArrayList ...
- 用js刷剑指offer(从上到下打印二叉树)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 牛客网链接 js代码 /* function TreeNode(x) { this.val = x; this.left = null ...
- 剑指Offer-22.从上往下打印二叉树(C++/Java)
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...
- 剑指offer--29.从上往下打印二叉树
层序遍历,队列 ------------------------------------------------------------------------------------- 时间限制:1 ...
- 剑指offer23 从上往下打印二叉树
没有把队列的头部弹出,出现内存错误:
- [剑指Offer]8-二叉树的下一个节点
链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...
- LeetCode ZigZag Conversion(将字符串排成z字型)
class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...
- 【读书笔记】剑指offer
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https: ...
随机推荐
- ASP.NET上传时间超过4M失败(超时)的解决方法
https://blog.csdn.net/shan1774965666/article/details/20836851 在web.config中的<system.web></sy ...
- c# 二进制序列化
public static T Deserialize<T, S>(S stream) where S : Stream where T : class, new() { using (s ...
- 流程控制<二>
上一篇:Numbers.Strings.Lists 笔记<一>下一篇:数据结构-Python3.7<三> 如果需要修改迭代中的数据,建议先赋值一个副本(e.g:序列,切片复制的 ...
- [android] notification入门
通知栏,对话框,Toast是我们接触的三个提示框,通知栏是在系统的应用com.adnroid.systemui当中的 接触的几个Manger,getSystemService()方法得到的,参数: A ...
- java-两个整数变量的交换-不需要定义第三方变量
代码如下: class Example { public static void main(String[] args) { /* * 位异或运算符的特点 * ^的特点:一个数据对另一个数据位异或两次 ...
- Flask 中的 特殊装饰器before_request/after_request
before_request :在请求收到之前绑定一个函数做一些事情. after_request: 每一个请求之后绑定一个函数,如果请求没有异常. teardown_request: 每一个请求之后 ...
- 设置div背景透明的CSS样式
div背景透明样式: 样式代码: .alert{filter:alpha(opacity=100); /* IE */ -moz-opacity:1.0; /* Moz + FF */ opacity ...
- 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...
- 如何用原生JS实现一个简单的promise
我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...
- CSS的引入方式及CSS选择器
一 CSS介绍 现在的互联网前端分三层: a.HTML:超文本标记语言.从语义的角度描述页面结构. b.CSS:层叠样式表.从审美的角度负责页面样式. c.JS:JavaScript .从交互的角度描 ...