说到二叉树遍历,脑海中立刻想到的就是深度优先遍历和广度优先遍历,这两种方式相信大家都驾轻就熟了,就不再过多累赘。
今天和大家分享的是之字形遍历二叉树。
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
设两个栈,s2存放奇数层,s1存放偶数层
遍历s2节点的同时按照左子树、右子树的顺序加入s1,
遍历s1节点的同时按照右子树、左子树的顺序加入s2
public void loop(TreeNode root) {
if (root == null) return;
ArrayList<TreeNode> res = new ArrayList<>();
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
boolean left2Right = true;
stack1.push(root);
while (!stack1.isEmpty() || !stack2.isEmpty()) {
// 从左向右
if (left2Right) {
while (!stack1.isEmpty()) {
TreeNode node = stack1.pop();
res.add(node);
if (node.left != null) {
stack2.push(node.left);
}
if (node.right != null) {
stack2.push(node.right);
}
}
// 从右向左
} else {
while (!stack2.isEmpty()) {
TreeNode node = stack2.pop();
res.add(node);
if (node.right != null) {
stack1.push(node.right);
}
if (node.left != null) {
stack1.push(node.left);
}
}
}
left2Right = !left2Right;
}
for (TreeNode node : res) {
System.out.println("" + node.value);
}
}