|
| 1 | +import java.util.ArrayList; |
| 2 | +import java.util.List; |
| 3 | + |
| 4 | +public class ReverseOddLevelsOfBinaryTree { |
| 5 | + /** |
| 6 | + Store all the level's data in a list by simply any traversal(pre-order here) |
| 7 | + Then again traverse the tree and when found the odd level, |
| 8 | + change the root data with the last element of the level-list and remove the last item |
| 9 | + */ |
| 10 | + public TreeNode reverseOddLevels(TreeNode root) { |
| 11 | + List<List<Integer>> list = new ArrayList<>(); |
| 12 | + tra(list, root, 0); |
| 13 | + modify(list, root, 0); |
| 14 | + return root; |
| 15 | + } |
| 16 | + private void modify(List<List<Integer>> res, TreeNode root, int level){ |
| 17 | + if(root == null) return; |
| 18 | + |
| 19 | + // Odd level |
| 20 | + if((level%2) != 0){ |
| 21 | + |
| 22 | + // Modify root data with last item of list, and then remove the last item |
| 23 | + List<Integer> lvlArr = res.get(level); |
| 24 | + root.val = lvlArr.get(lvlArr.size()-1); |
| 25 | + lvlArr.remove(lvlArr.size()-1); |
| 26 | + } |
| 27 | + |
| 28 | + modify(res,root.left,level+1); |
| 29 | + modify(res,root.right,level+1); |
| 30 | + } |
| 31 | + |
| 32 | + // generate list with level-order items |
| 33 | + private void tra(List<List<Integer>> res, TreeNode root, int level){ |
| 34 | + if(root == null) return; |
| 35 | + |
| 36 | + if(level >= res.size()) |
| 37 | + res.add(new ArrayList<>()); |
| 38 | + |
| 39 | + res.get(level).add(root.val); |
| 40 | + tra(res,root.left,level+1); |
| 41 | + tra(res,root.right,level+1); |
| 42 | + } |
| 43 | + |
| 44 | + static class TreeNode{ |
| 45 | + int val; |
| 46 | + TreeNode left; |
| 47 | + TreeNode right; |
| 48 | + |
| 49 | + public TreeNode() {} |
| 50 | + TreeNode(int val) { this.val = val; } |
| 51 | + public TreeNode(int val, TreeNode left, TreeNode right) { |
| 52 | + this.val = val; |
| 53 | + this.left = left; |
| 54 | + this.right = right; |
| 55 | + } |
| 56 | + } |
| 57 | +} |
0 commit comments