Remove all leaf nodes from a Generic Tree or N-ary Tree

Given a Generic tree, the task is to delete the leaf nodes from the tree.

Examples:

Input:
5
/  /  \  \
1   2   3   8
/   / \   \
15  4   5   6

Output:
5 : 1 2 3
1 :
2 :
3 :

Explanation:
Deleted leafs are:
8, 15, 4, 5, 6

Input:
8
/    |    \
9      7       2
/ | \    |    / / | \ \
4  5 6    10  11 1 2  2 3
Output:
8: 9 7 2
9:
7:
2:

Approach: Follow the steps given below to solve the problem

• Consider a function returning  root of the updated tree.
• Traverse the tree and check the condition:
• If the root is NULL return NULL.
• If the root itself is a leaf then delete the root and return NULL.
• Moving onto its children If the child node is a leaf then
• Delete that node and update the children vector as well.
• Recursively call for every child.

Below is the implementation of the above approach:

C++

 // C++ program to delete the // leaf from the generic tree   #include using namespace std;   // a treenode class class TreeNode { public:     int data;     vector children;       TreeNode(int data)     {         this->data = data;     } };   // Recursive function which delete // the leaf from tree   TreeNode* deleteleafnodes(TreeNode* root){     if(root==NULL)return NULL;     //if root is NULL return NULL     if(root->children.size()==0){  //if root itself is leaf then return NULL         delete root;         return NULL;     }     for(int i=0;ichildren.size();i++){//moving onto its children         TreeNode* child=root->children[i];         if(child->children.size()==0){       // if leaf then delete that node             delete child;             for(int j=i;jchildren.size()-1;j++){// update the children vector as well                 root->children[j]=root->children[j+1];             }             root->children.pop_back();             i--;         }     }     for(int i=0;ichildren.size();i++){  //recursive call         root->children[i]=deleteleafnodes(root->children[i]);     }     return root; }     // Function which will print the // tree level wise void printTheTree(TreeNode* root) {     if (root == NULL)         return;       cout << root->data << " "          << ":";     for (int i = 0;          i < root->children.size();          i++)         cout << root->children[i]->data                << " ";     cout << endl;       for (int i = 0;          i < root->children.size();          i++)         printTheTree(root->children[i]); }   // Driver code int main() {     // 5     //      / / \ \     // 1  2  3  8     //    /   /\  \     // 15  4  5  6       TreeNode* root = new TreeNode(5);     TreeNode* child1 = new TreeNode(1);     root->children.push_back(child1);     TreeNode* child11 = new TreeNode(15);     child1->children.push_back(child11);     TreeNode* child2 = new TreeNode(2);     root->children.push_back(child2);     TreeNode* child21 = new TreeNode(4);     TreeNode* child22 = new TreeNode(5);     child2->children.push_back(child21);     child2->children.push_back(child22);     TreeNode* child3 = new TreeNode(3);     root->children.push_back(child3);     TreeNode* child31 = new TreeNode(6);     child3->children.push_back(child31);     TreeNode* child4 = new TreeNode(8);     root->children.push_back(child4);       TreeNode* temp=deleteleafnodes(root);     printTheTree(temp); }

Java

 // Java program to delete the // leaf from the generic tree import java.util.*;   class GFG {    // a treenode class static class TreeNode {       int data;     ArrayList children;        TreeNode(int data)     {         this.data = data;         this.children = new ArrayList<>();     } };    // Recursive function which delete // the leaf from tree static TreeNode removeLeaf(TreeNode root) {   if(root==null){ return null;}// if root is null return null     if(root.children.size()==0){// if root itself is leaf return null      return null;}     // if root.children is a leaf node     // then delete it from children vector     for (int i = 0; i < root.children.size(); i++) {            TreeNode child= root.children.get(i);            // if it is  a leaf         if (child.children.size() == 0) {                // shifting the vector to left             // after the point i             for (int j = i; j < root.children.size() - 1; j++)                 root.children.set(j, root.children.get(j + 1));                // delete the last element             root.children.remove(root.children.size()-1);                i--;         }     }        // Remove all leaf node     // of children of root     for (int i = 0;          i < root.children.size();          i++) {            // call function for root.children         root.children.set(i,removeLeaf(root.children.get(i)));     }  return root; }    // Function which will print the // tree level wise static void printTheTree(TreeNode root) {     if (root == null)         return;           System.out.print(root.data+" :");       for (int i = 0; i < root.children.size(); i++)         System.out.print(root.children.get(i).data+" ");       System.out.println();        for (int i = 0; i < root.children.size(); i++)         printTheTree(root.children.get(i)); }    // Driver code public static void main(String []args) {     //     5     //  / / \ \     // 1  2  3  8     //   /   /\  \     // 15  4  5  6        TreeNode root = new TreeNode(5);     TreeNode child1 = new TreeNode(1);     root.children.add(child1);     TreeNode child11 = new TreeNode(15);     child1.children.add(child11);     TreeNode child2 = new TreeNode(2);     root.children.add(child2);     TreeNode child21 = new TreeNode(4);     TreeNode child22 = new TreeNode(5);     child2.children.add(child21);     child2.children.add(child22);     TreeNode child3 = new TreeNode(3);     root.children.add(child3);     TreeNode child31 = new TreeNode(6);     child3.children.add(child31);     TreeNode child4 = new TreeNode(8);     root.children.add(child4);        root=removeLeaf(root);     printTheTree(root); } }   // This code is contributed by rutvik_56

Python3

 # Python program to delete the # leaf from the generic tree   # a treenode class class TreeNode:     def __init__(self, data):         self.data = data         self.children = []   # Recursive function which delete # the leaf from tree def removeLeaf(root):     if(root==None): return None #if root is None return None     if(len(root.children)==0):return None #if root itself is leaf return None     # if root.children is a leaf node     # then delete it from children vector     i = 0     while i < len(root.children):         child = root.children[i]           # if it is  a leaf         if (len(child.children) == 0):               # shifting the vector to left             # after the point i             for j in range(i, len(root.children) - 1):                 root.children[j] = root.children[j + 1]               # delete the last element             root.children.pop()             i -= 1         i += 1       # Remove all leaf node     # of children of root     for i in range(len(root.children)):           # call function for root.children         root.children[i]=removeLeaf(root.children[i])     return root # Function which will print the # tree level wise def printTheTree(root):     if (root == None):         return     print("{} :".format(root.data), end="")     for i in range(len(root.children)):         print("{} ".format(root.children[i].data), end="")     print()     for i in range(len(root.children)):         printTheTree(root.children[i])   # Driver code if __name__ == "__main__":       #         5     #      / / \ \     #    1  2  3  8     #   /   /\  \     #  15  4  5  6       root = TreeNode(5)     child1 = TreeNode(1)     root.children.append(child1)     child11 = TreeNode(15)     child1.children.append(child11)     child2 = TreeNode(2)     root.children.append(child2)     child21 = TreeNode(4)     child22 = TreeNode(5)     child2.children.append(child21)     child2.children.append(child22)     child3 = TreeNode(3)     root.children.append(child3)     child31 = TreeNode(6)     child3.children.append(child31)     child4 = TreeNode(8)     root.children.append(child4)       root=removeLeaf(root)     printTheTree(root)   # This code is contributed by sanjeev2552

C#

 // C# program to delete the // leaf from the generic tree using System; using System.Collections; using System.Collections.Generic;    class GFG {     // a treenode class public class TreeNode {        public int data;     public ArrayList children;         public TreeNode(int data)     {         this.data = data;         this.children = new ArrayList();     } };     // Recursive function which delete // the leaf from tree public static TreeNode removeLeaf(TreeNode root) {   if(root==null) {return null;}//if root is null return null     if(root.children.Count==0){//if root itself is leaf return null      return null;}     // if root.children is a leaf node     // then delete it from children vector     for (int i = 0; i < root.children.Count; i++) {             TreeNode child= (TreeNode)root.children[i];             // if it is  a leaf         if (child.children.Count == 0) {                 // shifting the vector to left             // after the point i             for (int j = i; j < root.children.Count - 1; j++)             {                 root.children[j]= root.children[j + 1];             }                 // delete the last element             root.children.RemoveAt(root.children.Count - 1);                 i--;         }     }         // Remove all leaf node     // of children of root     for (int i = 0; i < root.children.Count; i++)     {         // call function for root.children         root.children[i]=removeLeaf((TreeNode)root.children[i]);     }  return root; }     // Function which will print the // tree level wise static void printTheTree(TreeNode root) {     if (root == null)         return;            Console.Write(root.data+" :");        for (int i = 0; i < root.children.Count; i++)         Console.Write(((TreeNode)root.children[i]).data + " ");        Console.WriteLine();         for (int i = 0; i < root.children.Count; i++)         printTheTree((TreeNode)root.children[i]); }     // Driver code public static void Main(string []args) {     //     5     //  / / \ \     // 1  2  3  8     //   /   /\  \     // 15  4  5  6         TreeNode root = new TreeNode(5);     TreeNode child1 = new TreeNode(1);     root.children.Add(child1);     TreeNode child11 = new TreeNode(15);     child1.children.Add(child11);     TreeNode child2 = new TreeNode(2);     root.children.Add(child2);     TreeNode child21 = new TreeNode(4);     TreeNode child22 = new TreeNode(5);     child2.children.Add(child21);     child2.children.Add(child22);     TreeNode child3 = new TreeNode(3);     root.children.Add(child3);     TreeNode child31 = new TreeNode(6);     child3.children.Add(child31);     TreeNode child4 = new TreeNode(8);     root.children.Add(child4);         root=removeLeaf(root);     printTheTree(root); } }   // This code is contributed by pratham76

Javascript



Output:

5 :1 2 3
1 :
2 :
3 :

Time Complexity: O(N)
Auxiliary Space: O(N)

Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!