Advertisement
uopspop

Untitled

Mar 19th, 2022
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17.  
  18. // Map<TreeNode, Integer> v_states = new HashMap<>();
  19. class MyTreeNode {
  20. TreeNode self;
  21. TreeNode parent;
  22. Integer leaf_count;
  23. Integer level;
  24. public MyTreeNode(TreeNode parent, TreeNode self, Integer leaf_count, Integer level) {
  25. this.parent = parent;
  26. this.self = self;
  27. this.leaf_count = leaf_count;
  28. this.level = level;
  29. }
  30. }
  31.  
  32. Map<TreeNode, MyTreeNode> node2state = new HashMap<>();
  33. Queue<TreeNode> q = new LinkedList<>();
  34.  
  35. public List<List<Integer>> findLeaves(TreeNode root) {
  36. List<List<Integer>> result_list = new ArrayList<>();
  37.  
  38. // 1. count leaf
  39. // 2. link parent
  40. // 3. collect leafs for the 1st batch
  41. traverse(null, root);
  42.  
  43. while (true) {
  44.  
  45. if (q.size() == 0) break;
  46.  
  47. TreeNode node = q.poll();
  48. MyTreeNode mynode = node2state.get(node);
  49.  
  50. // gather result
  51. if (result_list.size() == mynode.level) {
  52. result_list.add(new ArrayList<>());
  53. }
  54.  
  55. List<Integer> list = result_list.get(mynode.level);
  56. list.add(node.val);
  57.  
  58. // update parent leaf_count
  59. MyTreeNode mynode_parent = node2state.get(mynode.parent);
  60. if (mynode_parent == null) continue;
  61.  
  62. mynode_parent.leaf_count--;
  63. if (mynode_parent.leaf_count == 0) {
  64. mynode_parent.level = mynode.level + 1;
  65. q.offer(mynode.parent);
  66. }
  67.  
  68. }
  69.  
  70. return result_list;
  71. }
  72.  
  73. public void traverse(TreeNode parent, TreeNode node) {
  74. if (node == null) return;
  75.  
  76. if (node2state.containsKey(node) == false) {
  77. node2state.put(node, new MyTreeNode(parent, node, 0, 0));
  78. }
  79.  
  80. MyTreeNode mynode = node2state.get(node);
  81.  
  82. if (node.left != null) {
  83. mynode.leaf_count++;
  84. traverse(node, node.left);
  85. }
  86.  
  87. if (node.right != null) {
  88. mynode.leaf_count++;
  89. traverse(node, node.right);
  90. }
  91.  
  92. if (mynode.leaf_count == 0) {
  93. q.offer(node);
  94. }
  95.  
  96. }
  97.  
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement