剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=100
要求:空间复杂度:O(n),时间复杂度:O(n)
例如:
给定的二叉树是1,2,3,#,#,4,5
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例:
输入:
1,2,3,#,#,4,5
返回值:
[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
解题思路:
本题考察数据结构树的使用。运用队列先进先出的特点解决该问题,执行到某一层时,将当前层的数值放入vector中保留,再将结点指针弹出队列,存入其下一层结点指针至队列;每层进行奇偶判断,偶数层对vector反转,将该层的vector放入vector<vector<int>>中;最终就实现了之字形的顺序打印。
测试代码:
/*
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)
vector<vector<int>> v;
if(!pRoot)
return v;
queue<TreeNode*> q;
q.push(pRoot);
int l=0;
// 遍历所有结点
while(!q.empty())
int size=q.size();
vector<int> a;
// 遍历存放左右子树结点
while(size--)
TreeNode* n=q.front();
q.pop();
a.push_back(n->val);
if(n->left)
q.push(n->left);
if(n->right)
q.push(n->right);
l++;
// 如果l是偶数层,则将vector反转
if(l%2==0)
reverse(a.begin(), a.end());
v.push_back(a);
return v;
;
以上是关于剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章