题目描述
1. 层序遍历+集合反转
代码实现
public class Solution {
public List<List<Integer>> Print(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
boolean reverse = false;
while (!queue.isEmpty()) {
List<Integer> curLevel = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
curLevel.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
if (reverse) {
Collections.reverse(curLevel);
}
reverse = !reverse;
ret.add(new ArrayList<>(curLevel));
}
return ret;
}
}
复杂度分析
- 时间复杂度:
O
(
n
)
{O(n)}
O(n)
- 空间复杂度:
O
(
n
)
{O(n)}
O(n)
2. 两个栈
代码实现
public class Solution2 {
public List<List<Integer>> Print2(TreeNode root){
List<List<Integer>> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Stack<TreeNode> stackLeft = new Stack<>();
Stack<TreeNode> stackRight = new Stack<>();
stackLeft.push(root);
while (!stackLeft.isEmpty() || !stackRight.isEmpty()) {
List<Integer> curLevel = new ArrayList<>();
if (!stackLeft.isEmpty()) {
curLevel.clear();
while (!stackLeft.isEmpty()) {
TreeNode node = stackLeft.pop();
curLevel.add(node.val);
if (node.left != null) {
stackRight.push(node.left);
}
if (node.right != null) {
stackRight.push(node.right);
}
}
ret.add(new ArrayList<>(curLevel));
} else {
curLevel.clear();
while (!stackRight.isEmpty()) {
TreeNode node = stackRight.pop();
curLevel.add(node.val);
if (node.right != null) {
stackLeft.push(node.right);
}
if (node.left != null) {
stackLeft.push(node.left);
}
}
ret.add(new ArrayList<>(curLevel));
}
}
return ret;
}
}
复杂度分析
- 时间复杂度:
O
(
n
)
{O(n)}
O(n)
- 空间复杂度:
O
(
n
)
{O(n)}
O(n)