1
+ package com .leetcode .trees ;
2
+
3
+ import java .util .ArrayList ;
4
+ import java .util .List ;
5
+
6
+ import static org .junit .jupiter .api .Assertions .assertEquals ;
7
+
8
+ /**
9
+ * Level: Medium
10
+ * Problem Link: https://leetcode.com/problems/find-leaves-of-binary-tree/
11
+ * Problem Description:
12
+ * Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves, repeat
13
+ * until the tree is empty.
14
+ *
15
+ * Example:
16
+ * Input: [1,2,3,4,5]
17
+ *
18
+ * 1
19
+ * / \
20
+ * 2 3
21
+ * / \
22
+ * 4 5
23
+ *
24
+ * Output: [[4,5,3],[2],[1]]
25
+ *
26
+ * Explanation:
27
+ * 1. Removing the leaves [4,5,3] would result in this tree:
28
+ * 1
29
+ * /
30
+ * 2
31
+ *
32
+ * 2. Now removing the leaf [2] would result in this tree:
33
+ * 1
34
+ *
35
+ * 3. Now removing the leaf [1] would result in the empty tree:
36
+ * []
37
+ *
38
+ * @author rampatra
39
+ * @since 2019-08-01
40
+ */
41
+ public class LeavesOfBinaryTree {
42
+
43
+ /**
44
+ * THe idea is to perform a DFS and backtrack. While backtracking, check the height of the node and insert
45
+ * the node into the list indexed by their heights.
46
+ * Time Complexity:
47
+ * Space Complexity:
48
+ * Runtime: <a href=""></a>.
49
+ *
50
+ * @param root
51
+ * @return
52
+ */
53
+ public static List <List <TreeNode >> findLeavesOfBinaryTree (TreeNode root ) {
54
+ List <List <TreeNode >> levels = new ArrayList <>();
55
+ findLeavesOfBinaryTree (root , levels );
56
+ return levels ;
57
+ }
58
+
59
+ private static int findLeavesOfBinaryTree (TreeNode root , List <List <TreeNode >> levels ) {
60
+ if (root == null ) return -1 ;
61
+
62
+ int leftHeight = findLeavesOfBinaryTree (root .left , levels );
63
+ int rightHeight = findLeavesOfBinaryTree (root .right , levels );
64
+ int height = Math .max (leftHeight , rightHeight ) + 1 ;
65
+
66
+ if (height >= levels .size ()) {
67
+ levels .add (height , new ArrayList <>());
68
+ }
69
+ levels .get (height ).add (root );
70
+
71
+ return height ;
72
+ }
73
+
74
+ public static void main (String [] args ) {
75
+ /*
76
+ BST looks like:
77
+
78
+ 4
79
+ / \
80
+ 1 7
81
+ / \ \
82
+ 3 8 20
83
+ / \
84
+ 2 6
85
+ */
86
+ TreeNode root = new TreeNode (4 );
87
+ root .left = new TreeNode (1 );
88
+ root .right = new TreeNode (7 );
89
+ root .left .left = new TreeNode (3 );
90
+ root .left .right = new TreeNode (8 );
91
+ root .left .left .left = new TreeNode (2 );
92
+ root .left .left .right = new TreeNode (6 );
93
+ root .right .right = new TreeNode (20 );
94
+
95
+ assertEquals ("[[2, 6, 8, 20], [3, 7], [1], [4]]" , findLeavesOfBinaryTree (root ).toString ());
96
+ }
97
+ }
0 commit comments