从上往下打印二叉树这个是不分行的,用一个队列就可以实现
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: ...
随机推荐
-
linux磁盘分区-系统安装
零 系统下载: https://lists.centos.org/pipermail/centos-announce/2016-May/021895.html 往下拉可以看到 一 系统安装 1, 2, ...
-
adb 服务端口2037被占,导致adb和appium无法工作
症状1: 命令行运行 adb 相关命令,提示如下: adb server is out of date. killing...ADB server didn't ACK* failed to star ...
-
(转)Linux下MatlabCompilerRuntime的安装和使用
1MCR简介 MCR之前是 Matlab Component Runtime的缩写,后更名为Matlab Compiler Runtime.MCR实际上是一组独立的共享库,也即是常说的动态连接库,所起 ...
-
使--no-ri --no-rdoc成为gem安装的默认选项
在使用gem install命令的时候,希望加上--no-ri --no-rdoc选项,但是不希望每一次都手动加上这个选项. 其实可以通过编辑配置文件,改变gem install的默认选项. 在win ...
-
1 weekend110的Linux带图形系统安装 + 网络配置 + 静态IP设置
一.weekend110的Linux带图形系统安装 二.网络配置 明明是配置好的啊,只能说是域名出现问题了, 出现ping:unknow host www.baidu.com的问题解决 解决Ubunt ...
-
Linux V4L2之camera
一.硬件知识 1. 摄像头硬件结构和工作原理,如图1&图2 外部光线穿过lens镜头,经过红外滤光片后光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字 ...
-
su 与 su - 比较
原文地址:http://blog.chinaunix.net/uid-25557346-id-2889329.html 今天有一同事说在切换用户的时候,找不到该用户下用户命令,后来仔细检查了一下过 ...
-
2. Attention Is All You Need(Transformer)算法原理解析
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
-
PHP和Mysql事物处理
这几天做支付的时候,又用到了事物,为了方便自己以后查看,今天闲的没事就把以前的东西整理下.(其中引用别人的东西,在这里谢谢他们贡献的代码!) 一.事务处理概述: 事务:是若干事件的集合 事务处理:当所 ...
-
Jupyter notebook安装与使用
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 安装 安装python 3 pip安装 pip3 install - ...