题目描述:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=100
要求:空间复杂度:O(n),时间复杂度:O(n)
例如:
给定的二
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
叉树是{1,2,3
示例:
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
解题思路:
#,#,4本题考察数据结构树的使用。运用队列先进先出的特点解决该问题,执行到某一层时,将当前层的数值放入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; } };