http://www.lintcode.com/en/problem/binary-tree-level-order-traversal/
题目:给定二叉树,按层级顺序输出。如:二叉树{3,9,20,#,#,15,7}
3 / \ 9 20 / \ 15 7
输出:
[ [3], [9,20], [15,7] ]
解答:首先判断根节点是否为空,为空直接返回。
将当前根节点放入队列中,当队列不为空时进行以下循环:
1.将队列头取出并记录其值;
2.建立新的arraylist,将取出元素的值放入list中(控制list的长度:queue.size() );
3.将当前取出的元素左右非空子节点加入队列中;
第一次犯错:未判断根节点为空的情况;
第二次犯错: queue.size()会动态变化,应在循环前取出并保存其值;
代码:
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) { // write your code here ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if (root == null) { return res; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()){ ArrayList<Integer> row = new ArrayList<>(); int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode father = queue.poll(); row.add(father.val); if (father.left != null) { queue.offer(father.left); } if (father.right != null) { queue.offer(father.right); } } res.add(row); } return res; }
变题1:http://www.lintcode.com/en/problem/binary-tree-level-order-traversal-ii/
题目:同上,区别是从底层往上层输出;
解答:在以上代码返回前加上:Collections.reverse(res) 即可
变题2:http://www.lintcode.com/en/problem/binary-tree-zigzag-level-order-traversal/
题目:将二叉树按zigzag顺序输出,如:输入{3,9,20,6,#,15,7},输出[ [3], [20, 9], [6,15, 7];
解答:不再使用queue,使用两个stack来完成操作;
代码:
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) { // write your code here ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if (root == null) { return res; } Stack<TreeNode> stackCur = new Stack<>(); stackCur.push(root); boolean order = true; while (!stackCur.isEmpty()) { ArrayList<Integer> row = new ArrayList<>(); Stack<TreeNode> stackNext = new Stack<>(); while (!stackCur.isEmpty()) { TreeNode father = stackCur.pop(); row.add(father.val); if (order) { if (father.left != null) { stackNext.push(father.left); } if (father.right != null) { stackNext.push(father.right); } } else { if (father.right != null) { stackNext.push(father.right); } if (father.left != null) { stackNext.push(father.left); } } } res.add(row); order = !order; stackCur = stackNext; } return res; }