每天一道leetcode-103二叉树的锯齿形层次遍历
- 2019 年 10 月 4 日
- 筆記
前言
今天的题目 每天的题目见github(看最新的日期): https://github.com/gzc426
昨天的题解
每天一道leetcode-103二叉树的锯齿形层次遍历
题目

题目详解
思路
- 剑指offer思路的实现,使用两个栈,具体看代码
- 比如第一层3的话那么下一层利用栈存入9和20,然后下一层的栈就是先弹出的就是20,然后是9,这样就实现了之字形打印。
代码
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { TreeNode pRoot = root; Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); ArrayList<Integer> tempResult = new ArrayList<>(); List<List<Integer>> resultList = new ArrayList<>(); if(pRoot == null) return resultList; int layerCount = 1; stack1.push(pRoot); while(!stack1.isEmpty() || !stack2.isEmpty()) { while(!stack1.isEmpty()) { TreeNode tempNode = stack1.pop(); if(tempNode.left != null) { stack2.push(tempNode.left);//stack2中按照先左后右的方式入栈, }//那么下一层就是按照先右后左出栈,完成之字形。 if(tempNode.right != null) stack2.push(tempNode.right); tempResult.add(tempNode.val); if(stack1.isEmpty()) {//stack1为空,说明stack1中存的这些节点打印完了,所以要把这一层的节点内容存入结果中 resultList.add(new ArrayList<Integer>(tempResult)); tempResult.clear(); } } while(!stack2.isEmpty()) {//这里大体思路和上面相同,要注意的就是由于上一层已经是逆序打印 TreeNode tempNode = stack2.pop();//所以这一层必须先右后左入栈,才能确保是顺序打印 if(tempNode.right != null) { stack1.push(tempNode.right); } if(tempNode.left != null) stack1.push(tempNode.left); tempResult.add(tempNode.val); if(stack2.isEmpty()) { resultList.add(new ArrayList<Integer>(tempResult)); tempResult.clear(); } } } return resultList; } }