请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其余行以此类推java
这道题能够借助两个栈来实现,用文字很差描述,也许直接看代码会好一些node
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { // 用来存放结点 ArrayList<ArrayList<Integer>> list = new ArrayList<>(); if(pRoot == null) { return list; } // 判断奇偶层 int layer = 1; // 存放奇数层结点 Stack<TreeNode> s1 = new Stack<>(); // 存放偶数层结点 Stack<TreeNode> s2 = new Stack<>(); // 先把根结点放入奇数层 s1.push(pRoot); // 若是两个栈都为空,那么就证实全部结点都已遍历完毕 while(!s1.empty() || !s2.empty()) { // 当前层是奇数层 if(layer % 2 != 0) { // 存放奇数层的结点 ArrayList<Integer> temp = new ArrayList<>(); // 把奇数层的结点逐个弹出,用 temp 保存起来 // 同时把每一个弹出结点的左右子结点压入栈 // 要注意栈的特色是后进先出,所以出栈顺序和入栈顺序是相反的 while(!s1.empty()) { TreeNode node = s1.pop(); if(node != null) { temp.add(node.val); s2.push(node.left); s2.push(node.right); } } if(!temp.isEmpty()) { list.add(temp); layer++; } } else { // 原理同上 ArrayList<Integer> temp = new ArrayList<>(); while(!s2.empty()) { TreeNode node = s2.pop(); if(node != null) { temp.add(node.val); s1.push(node.right); s1.push(node.left); } } if(!temp.isEmpty()) { list.add(temp); layer++; } } } return list; } }