题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
练习地址
L - 0103】m - 二叉树的锯齿形层序遍历⭐⭐⭐
实现
方法1:两个栈
/**之字形打印二叉树*/
public class C32_tree_PrintTree3 {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public static ArrayList<ArrayList<Integer>> print(TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (root == null)
return res;
Stack<TreeNode> s1 = new Stack<TreeNode>();//s1存奇数层节点
Stack<TreeNode> s2 = new Stack<TreeNode>();//s2存偶数层节点
s1.push(root);
int count = 1;
while (!s1.empty() || !s2.empty()) {
if (count % 2 != 0) { // 奇,先左子树再右子树
ArrayList<Integer> list = new ArrayList<>();
while (!s1.empty()) {//每一层全部出栈
TreeNode node = s1.pop();
if (node != null) {
list.add(node.val);
s2.push(node.left);
s2.push(node.right);
}
}
if (!list.isEmpty()) {
res.add(list);
}
} else { // 偶,先右子树再左子树
ArrayList<Integer> list = new ArrayList<>();
while (!s2.empty()) {//每一层全部出栈
TreeNode node = s2.pop();
if (node != null) {
list.add(node.val);
s1.push(node.right);
s1.push(node.left);
}
}
if (!list.isEmpty()) {
res.add(list);
}
}
count++;
}
return res;
}
}
方法2:双端队列
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root != null) queue.add(root);
while(!queue.isEmpty()) {
LinkedList<Integer> tmp = new LinkedList<>();
for(int i = queue.size(); i > 0; i--) {
TreeNode node = queue.poll();
if(res.size() % 2 == 0) tmp.addLast(node.val); // 偶数层 -> 队列头部
else tmp.addFirst(node.val); // 奇数层 -> 队列尾部
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(tmp);
}
return res;
}
}
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er--3/
Test
public static void main(String[] args) {
// 1
// 2 3
// 4 5
TreeNode root = new TreeNode(1);
TreeNode root2 = new TreeNode(2);
TreeNode root3 = new TreeNode(3);
TreeNode root4 = new TreeNode(4);
TreeNode root5 = new TreeNode(5);
root.left = root2;
root.right = root3;
root2.left = root4;
root2.right = root5;
ArrayList<ArrayList<Integer>> list = print(root);
for (ArrayList<Integer> l : list) {
System.out.print(l + " ");
}
}