之字形遍历二叉树

昨天面试了美团的后端,一面最后问了一道这样的算法题,我只写了个层次遍历,那道题返回的是一个嵌套的 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);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值