网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如: 给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
- 节点总数 <= 1000
算法
(BFS,层序遍历) O(n)
和 剑指 Offer 32 – II. 从上到下打印二叉树 II 层序遍历的思路一样,只需要通过一个 bool 变量在每行遍历结束之后翻转下一行的顺序即可。
时间复杂度
O(n)
空间复杂度
O(n)
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
queue<TreeNode*> q;
if (root) q.push(root);
bool zigzag = false;
while (q.size()) {
int sz = q.size();
vector<int> line;
while (sz -- ) {
auto t = q.front();
q.pop();
line.push_back(t->val);
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
if (zigzag) reverse(line.begin(), line.end());
ans.push_back(line);
zigzag = !zigzag;
}
return ans;
}
};
Java 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
if (root != null) {
q.offer(root);
}
boolean zigzag = false;
while (!q.isEmpty()) {
int sz = q.size();
List<Integer> line = new ArrayList<>();
while (sz -- > 0) {
TreeNode t = q.poll();
line.add(t.val);
if (t.left != null) {
q.offer(t.left);
}
if (t.right != null) {
q.offer(t.right);
}
}
if (zigzag) {
Collections.reverse(line);
}
ans.add(line);
zigzag = !zigzag;
}
return ans;
}
}
Python 代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
ans = []
q = deque()
if root:
q.append(root)
zigzag = False
while q:
sz = len(q)
line = []
while sz > 0:
t = q.popleft()
line.append(t.val)
if t.left:
q.append(t.left)
if t.right:
q.append(t.right)
sz -= 1
if zigzag:
line.reverse()
ans.append(line)
zigzag = not zigzag
return ans
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版