剑指offer 按之字型顺序打印二叉树
2024-09-02 16:34:29
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
使用两个栈进行存储,我们在打印某一行节点的时候,需要将下一行的节点保存到相应的栈中,如果当前打印奇数层,那么先保存左子节点,再保存右子节点;
如果我们当前打印的偶数层,那么先保存右子节点,再保存左子节点。
注意循环退出条件。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
stack<TreeNode*> odd;//先左后右
stack<TreeNode*> even;//先右后左
vector<vector<int> > result;
if(pRoot == nullptr){
return result;
}
TreeNode* p = pRoot;
int flag = ;
odd.push(p);
while(!odd.empty() || !even.empty()){
vector<int> tmp;
if(flag % ){//当前奇数层
while(!odd.empty()){
p = odd.top();
tmp.push_back(p -> val);
odd.pop();
if(p -> left != nullptr){
even.push(p -> left);
}
if(p -> right != nullptr){
even.push(p -> right);
}
}
result.push_back(tmp);
++flag;
}
else{//当前偶数层
while(!even.empty()){
p = even.top();
tmp.push_back(p -> val);
even.pop();
if(p -> right != nullptr){
odd.push(p -> right);
}
if(p -> left != nullptr){
odd.push(p -> left);
} }
result.push_back(tmp);
++flag;
}
}
return result;
} };
最新文章
- redis消息队列简单应用
- [蓝牙] 5、Battery Service module
- sizzle源码分析 (4)sizzle 技术总结及值得我们学习的地方
- Android 源码 判断网络数据类型
- 简谈HTML5与APP技术应用
- codeforces 391C3 - The Tournament
- angular2地址栏路由配置
- 在web page中使鼠标右击失效的几种方法
- 使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word
- 假面舞会[NOI2008]
- 一个综合实例讲解vue的基础知识点。
- jsp分页
- 判断DataTale中判断某个字段中包含某个数据
- WEB前端 HTML
- springdataJAP的更新与保存的方法是同一个
- linux下用php将doc、ppt转图片
- google Guava包的ListenableFuture解析
- Hadoop---桥接集群的搭建
- 12th 对礼物挑选小工具的WBS功能分解
- shell字符串操作技巧