昨天面试了美团的后端,一面最后问了一道这样的算法题,我只写了个层次遍历,那道题返回的是一个嵌套的 ArrayList ,然后我跟面试官说再遍历这个 ArrayList 将其中的需要逆序的在进行逆序。之后面试官就问我这样实现的时间复杂度,我也没答上来。 :(
这道题是 LeetCode 上的会员题目,不过左程云的书里面也有。
思路是使用双端队列,在遍历从左到右的层时,从队首出,队尾依次进左右孩子;在遍历从右到左的层时,从队尾出,队首依次进右左孩子。
import java.util.Deque;
import java.util.LinkedList;
public class PrintByZigZag {
public static void printByZigZag(TreeNode node) {
if(node == null) return;
Deque<TreeNode> deque = new LinkedList<>();
TreeNode last = node;
TreeNode nLast = null;
boolean lr = true;
int level = 1;
deque.offerFirst(node);
printLevel(level++, lr);
while (!deque.isEmpty()) {
if (lr) {
node = deque.pollFirst();
if (node.left != null) {
nLast = nLast == null ? node.left : nLast;
deque.offerLast(node.left);
}
if (node.right != null) {
nLast = nLast == null ? node.right : nLast;
deque.offerLast(node.right);
}
} else {
node = deque.pollLast();
if (node.right != null) {
nLast = nLast == null ? node.right : nLast;
deque.offerFirst(node.right);
}
if (node.left != null) {
nLast = nLast == null ? node.left : nLast;
deque.offerFirst(node.left);
}
}
System.out.print(node.val + " ");
if (last == node && !deque.isEmpty()) {
lr = !lr;
last = nLast;
nLast = null;
System.out.print(" dq 大小 " + deque.size());
System.out.println();
printLevel(level++, lr);
}
}
}
public static void printLevel(int level, boolean lr) {
System.out.print("Level " + level + " :");
System.out.print(lr ? " 从左到右 " : " 从右到左 ");
}
public static void main(String[] args) {
TreeNode head = new TreeNode(1);
head.left = new TreeNode(2);
head.right = new TreeNode(3);
head.left.left = new TreeNode(4);
head.right.left = new TreeNode(5);
head.right.right = new TreeNode(6);
head.right.left.left = new TreeNode(7);
head.right.left.right = new TreeNode(8);
printByZigZag(head);
}
}
2998

被折叠的 条评论
为什么被折叠?



