请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
1.使用两个栈来分别存储奇数层节点和偶数层节点。
2.注意两个栈的插入顺序是不同的。
3.对于奇数层来说,也就是从左往右的顺序,先添加左子树,然后添加右子树。对于偶数层,刚好相反,先添加右子树,然后添加左子树。
1 /* 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 public TreeNode(int val) { 7 this.val = val; 8 } 9 } 10 */ 11 import java.util.Stack; 12 import java.util.ArrayList; 13 public class Solution { 14 public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { 15 //list变量,中间每次加进ArrayList<Integer>的temp变量 16 ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 17 //考虑最特殊情况 18 if (pRoot == null) 19 return list; 20 int level = 1; 21 //s1存奇数层节点,默认根为第1层 22 Stack<TreeNode> s1 = new Stack<TreeNode>(); 23 s1.push(pRoot); 24 //s2存偶数层节点 25 Stack<TreeNode> s2 = new Stack<TreeNode>(); 26 27 //因为s1放奇数层节点,s2放偶数层节点,所以当两个堆栈都为空就停止了循环 28 //都为空的对立面是 不都为空 29 while (!s1.empty() || !s2.empty()) { 30 if (level%2 != 0) {//奇数层的操作 31 ArrayList<Integer> temp = new ArrayList<Integer>(); 32 while (!s1.isEmpty()) {//23行代码保证了堆栈上来不可能为空,只要非空,执行while 33 TreeNode node = s1.pop(); 34 if(node != null) { 35 temp.add(node.val); 36 s2.push(node.left); //给另一方的堆栈入栈 37 s2.push(node.right); 38 } 39 } 40 if (!temp.isEmpty()) { //判断temp是否为空 41 list.add(temp); 42 level++; 43 } 44 } else {//偶数层的操作 45 ArrayList<Integer> temp = new ArrayList<Integer>(); 46 while (!s2.isEmpty()) { 47 TreeNode node = s2.pop(); 48 if(node != null) { 49 temp.add(node.val); 50 s1.push(node.right); //给另一方的堆栈入栈 51 s1.push(node.left); 52 } 53 } 54 if (!temp.isEmpty()){ //判断temp是否为空 55 list.add(temp); 56 level++; 57 } 58 } 59 } 60 return list;//返回结果即可 61 } 62 }