The path of all the leafs from a binary tree is processed by traversing the tree and passing the list of Nodes that are higher in the hierarchy. If a node doesn't have children it is a leaf and we store the path in the list of path to return.
This example uses a binary tree with 5 nodes. The root has 2 children, one that is a leaf and the other that has 2 children.
1 / \ 2 3 / \ 4 5
import java.util.ArrayList; public class InterviewPathRootLeaves { static class Node { int id; Node(int id){ this.id = id; } Node left; Node right; } public ArrayList<ArrayList<Integer>> getPaths( Node root ){ ArrayList<ArrayList<Integer>> toReturn = new ArrayList<ArrayList<Integer>>(); getPaths( root, new ArrayList<Integer>(), toReturn); return toReturn; } public void getPaths( Node root, ArrayList<Integer> path, ArrayList<ArrayList<Integer>> results ){ if( root == null ) return; path.add( root.id ); // If the node is a leaf if( root.left == null && root.right == null ){ results.add( new ArrayList<Integer>( path ) ); } else { getPaths( root.left, path, results ); getPaths( root.right, path, results ); } // Remove the last element path.remove( path.size() - 1 ); } public static void main(String[] argv) throws Exception { Node root = new Node(1); root.left = new Node(2); Node n3 = new Node(3); root.right = n3; n3.left = new Node(4); n3.right = new Node(5); InterviewPathRootLeaves s = new InterviewPathRootLeaves(); ArrayList<ArrayList<Integer>> results = s.getPaths( root ); for( ArrayList<Integer> c: results ){ System.out.print("["); String sep = ""; for( Integer i: c ){ System.out.print( sep + i ); sep = ", "; } System.out.println("]"); } } }
[1, 2] [1, 3, 4] [1, 3, 5]
The algorithm goes through all the nodes recursively. In the example we have 3 leafs, so we have 3 paths stored and rendered in the output.