【双栈法,beat 99 %】 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
思路:
利用栈后入先出的特性,一个栈保存当前层节点,一个栈保存下一层节点。入栈规则如下:
- 当前层为奇数层时:下一层为从左到右输出,故从右到左入栈即可。
- 当前层为偶数层时:下一层为从右到左输出,故从左到右入栈即可。
代码:
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); // 总结果 ArrayList<Integer> layerRes; // 每层的结果 if(pRoot == null) return res; Stack<TreeNode> curLayer = new Stack<>(); // 当前层节点 Stack<TreeNode> nextLayer;// 下一层节点 curLayer.push(pRoot); int nLayer = 0; while(!curLayer.empty()){ nLayer++; int size = curLayer.size(); layerRes = new ArrayList<>(); nextLayer = new Stack<>(); // 重置nextLayer while(size-- > 0){ TreeNode tempNode = curLayer.pop(); layerRes.add(tempNode.val); if(nLayer % 2 == 0){ // 偶数层:下一层为从左到右输出,故从右到左入栈即可 if(tempNode.right != null) nextLayer.push(tempNode.right); if(tempNode.left != null) nextLayer.push(tempNode.left); }else{ //奇数层:下一层为从右到左输出,故从左到右入栈即可 if(tempNode.left != null) nextLayer.push(tempNode.left); if(tempNode.right != null) nextLayer.push(tempNode.right); } } curLayer = nextLayer; // 更新下一层 res.add(layerRes); } return res; } }