不准访问
- 积分
- 108
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-12-13
- 最后登录
- 1970-1-1
|
思路跟把整个binary tree inorder存到array里很像。
先dfs求树的高度h。
然后把每层都存到大小为2^h - 1的array里,逐层打出来就好了。
- class Solution {
- /**
- * Sample input:
- *
- * 1
- * / \
- * 2 3
- * / \ / \
- * 4 5 6 7
- *
- * Expected output:
- * 1
- * 2 3
- * 4 5 6 7
- *
- * Follow up expected output:
- * 1
- * 2 3
- * 4 5 6 7
- **/
- public void levelOrderPrint(TreeNode root) {
- int h = dfs(root);
- int totalNodes = (1 << h) - 1;
- Map<TreeNode, int[]> m = new HashMap<>(); // node2(l,r)
- Queue<TreeNode> q = new LinkedList<>();
- q.offer(root);
- m.put(root, new int[]{0, totalNodes - 1});
- int currH = h;
- while (!q.isEmpty()) {
- int size = q.size();
- int[] lvl = new int[totalNodes];
- for (int i = 0; i < size; i++) {
- TreeNode curr = q.poll();
- int currPos = (m.get(curr)[1] + m.get(curr)[0]) / 2;
- lvl[currPos] = curr.val;
- if (curr.left != null) {
- q.offer(curr.left);
- m.put(curr.left, new int[]{m.get(curr)[0], currPos - 1});
- }
- if (curr.right != null) {
- q.offer(curr.right);
- m.put(curr.right, new int[]{currPos + 1, m.get(curr)[1]});
- }
- }
- currH--;
- for (int i = 0; i < lvl.length; i++) {
- System.out.print(lvl[i] != 0 ? lvl[i] : " ");
- }
- System.out.println();
- }
- }
- private int dfs(TreeNode root) {
- if (root == null) return 0;
- return Math.max(dfs(root.left), dfs(root.right)) + 1;
- }
- public static void main(String[] args) {
- TreeNode _1 = new TreeNode(1);
- TreeNode _2 = new TreeNode(2);
- TreeNode _3 = new TreeNode(3);
- _1.left = _2;
- _1.right = _3;
- TreeNode _4 = new TreeNode(4);
- TreeNode _5 = new TreeNode(5);
- _2.left = _4;
- _2.right = _5;
- TreeNode _6 = new TreeNode(6);
- TreeNode _7 = new TreeNode(7);
- _3.left = _6;
- _3.right = _7;
- new Solution().levelOrderPrint(_1);
- }
- }
复制代码 |
|