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