Related Articles
Print all nodes in a binary tree having K leaves
• Difficulty Level : Easy
• Last Updated : 30 Oct, 2019

Given a binary tree and a integer value K, the task is to find all nodes in given binary tree having K leaves in subtree rooted with them.

Examples :

// For above binary tree
Input : k = 2
Output: {3}
// here node 3 have k = 2 leaves

Input : k = 1
Output: {6}
// here node 6 have k = 1 leave

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

Here any node having K leaves means sum of leaves in left subtree and in right subtree must be equal to K. So to solve this problem we use Postorder traversal of tree. First we calculate leaves in left subtree then in right subtree and if sum is equal to K, then print current node. In each recursive call we return sum of leaves of left subtree and right subtree to it’s ancestor.

Below is the implementation of above approach:

## C++

 // C++ program to count all nodes having k leaves// in subtree rooted with them#includeusing namespace std;  /* A binary tree node  */struct Node{    int data ;    struct Node * left, * right ;};  /* Helper function that allocates a new node with the   given data and NULL left and right pointers. */struct Node * newNode(int data){    struct Node * node = new Node;    node->data = data;    node->left = node->right = NULL;    return (node);}  // Function to print all nodes having k leavesint kLeaves(struct Node *ptr,int k){    // Base Conditions : No leaves    if (ptr == NULL)        return 0;      // if node is leaf    if (ptr->left == NULL && ptr->right == NULL)        return 1;      // total leaves in subtree rooted with this    // node    int total = kLeaves(ptr->left, k) +                kLeaves(ptr->right, k);      // Print this node if total is k    if (k == total)        cout << ptr->data << " ";      return total;}  // Driver program to run the caseint main(){    struct Node *root = newNode(1);    root->left        = newNode(2);    root->right       = newNode(4);    root->left->left  = newNode(5);    root->left->right = newNode(6);    root->left->left->left  = newNode(9);    root->left->left->right  = newNode(10);    root->right->right = newNode(8);    root->right->left  = newNode(7);    root->right->left->left  = newNode(11);    root->right->left->right  = newNode(12);      kLeaves(root, 2);      return 0;}

## Java

 // Java program to count all nodes having k leaves // in subtree rooted with them class GfG {  /* A binary tree node */static class Node {     int data ;     Node left, right ;    Node(int data)    {        this.data = data;    }    Node()    {              }}  /* Helper function that allocates a new node with the given data and NULL left and right pointers. */static Node newNode(int data) {     Node node = new Node();     node.data = data;     node.left = null;    node.right = null;     return (node); }   // Function to print all nodes having k leaves static int kLeaves(Node ptr,int k) {     // Base Conditions : No leaves     if (ptr == null)         return 0;       // if node is leaf     if (ptr.left == null && ptr.right == null)         return 1;       // total leaves in subtree rooted with this     // node     int total = kLeaves(ptr.left, k) + kLeaves(ptr.right, k);       // Print this node if total is k     if (k == total)         System.out.print(ptr.data + " ");       return total; }   // Driver program to run the case public static void main(String[] args) {     Node root = newNode(1);     root.left     = newNode(2);     root.right     = newNode(4);     root.left.left = newNode(5);     root.left.right = newNode(6);     root.left.left.left = newNode(9);     root.left.left.right = newNode(10);     root.right.right = newNode(8);     root.right.left = newNode(7);     root.right.left.left = newNode(11);     root.right.left.right = newNode(12);       kLeaves(root, 2);   } }

## Python3

 # Python3 program to count all nodes  # having k leaves in subtree rooted with them  # A binary tree node has data, pointer to # left child and a pointer to right child # Helper function that allocates a new node  # with the given data and None left and # right pointers class newNode:    def __init__(self, data):        self.data = data        self.left = None        self.right = None  # Function to print all nodes having k leaves def kLeaves(ptr, k):      # Base Conditions : No leaves    if (ptr == None):        return 0      # if node is leaf    if (ptr.left == None and         ptr.right == None):        return 1      # total leaves in subtree rooted with this    # node    total = kLeaves(ptr.left, k) + \            kLeaves(ptr.right, k)      # Prthis node if total is k    if (k == total):        print(ptr.data, end = " ")      return total   # Driver code root = newNode(1) root.left = newNode(2) root.right = newNode(4) root.left.left = newNode(5) root.left.right = newNode(6) root.left.left.left = newNode(9) root.left.left.right = newNode(10) root.right.right = newNode(8) root.right.left = newNode(7) root.right.left.left = newNode(11) root.right.left.right = newNode(12)   kLeaves(root, 2)   # This code is contributed by SHUBHAMSINGH10

## C#

 // C# program to count all nodes having k leaves // in subtree rooted with them using System;      class GfG {  /* A binary tree node */public class Node {     public int data ;     public Node left, right ;    public Node(int data)    {        this.data = data;    }    public Node()    {              }}  /* Helper function that allocates a new node with the given data and NULL left and right pointers. */static Node newNode(int data) {     Node node = new Node();     node.data = data;     node.left = null;    node.right = null;     return (node); }   // Function to print all nodes having k leaves static int kLeaves(Node ptr,int k) {     // Base Conditions : No leaves     if (ptr == null)         return 0;       // if node is leaf     if (ptr.left == null && ptr.right == null)         return 1;       // total leaves in subtree rooted with this     // node     int total = kLeaves(ptr.left, k) + kLeaves(ptr.right, k);       // Print this node if total is k     if (k == total)         Console.Write(ptr.data + " ");       return total; }   // Driver program to run the case public static void Main(String[] args) {     Node root = newNode(1);     root.left = newNode(2);     root.right = newNode(4);     root.left.left = newNode(5);     root.left.right = newNode(6);     root.left.left.left = newNode(9);     root.left.left.right = newNode(10);     root.right.right = newNode(8);     root.right.left = newNode(7);     root.right.left.left = newNode(11);     root.right.left.right = newNode(12);       kLeaves(root, 2);   } }  // This code has been contributed by 29AjayKumar

Output:
5 7

Time complexity : O(n)

This article is contributed by Shashank Mishra ( Gullu ). If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.