请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
方式一:借助辅助栈的方式
public static List<List<Integer>> levelOrder3(TreeNode root) {
if (root == null) {
return null;
}
List<List<Integer>> list = new ArrayList<>();
// 借助栈来保存每一行
Stack<TreeNode> stack = new Stack<>();
int lines = 0;
stack.push(root);
while (!stack.isEmpty()) {
List<Integer> subList = new ArrayList<>();
int count = stack.size();
Stack<TreeNode> newStack = new Stack<>();
while (!stack.isEmpty()) {
newStack.push(stack.pop());
}
while (count > 0) {
count--;
// 这里如果使用一个栈,那么就会出现一个问题:
// 即栈中原有两个元素,然后取出一个进行while循环
// 此时又会加入两个,导致栈中原本想要的是剩下一个元素变成了3个元素
TreeNode node = newStack.pop();
if (node == null) {
continue;
}
subList.add(node.val);
if (lines%2 == 0) {
stack.add(node.right);
stack.add(node.left);
} else {
stack.add(node.left);
stack.add(node.right);
}
}
lines++;
if (subList.size() != 0)
list.add(subList);
}
return list;
}
方式二:借助队列以及List集合反转
public List<List<Integer>> levelOrder4(TreeNode root) {
if (root == null) {
return null;
}
List<List<Integer>> list = new ArrayList<>();
// 用于存储每一行的元素
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean reverse = false;
while (!queue.isEmpty()) {
List<Integer> subList = new ArrayList<>();
int count = queue.size();
while (count > 0) {
// 这个减1的操作不能放在最末尾,否则可能会因为当前节点是null导致没有减1
count--;
TreeNode node = queue.poll();
if (node == null) {
continue;
}
subList.add(node.val);
queue.offer(node.left);
queue.offer(node.right);
}
// 借助Collections的reverse方法对List集合中的元素进行反转
if (reverse) {
Collections.reverse(subList);
}
if (subList.size() != 0) {
list.add(subList);
}
reverse = !reverse;
}
return list;
}
网友评论