Create a mirror of an m–ary Tree

By | November 17, 2021
Create a mirror of an m–ary Tree

Problem

Given an m-ary tree that can have a count of children greater than 2. Convert it into its mirror tree.

Sample Input

Sample Output

Approach

We can use “Depth First Search” to solve this problem. We can first store all the children of each node in a list. We traverse the given tree in any order and for each node reverse its children list.  The reversal can be done when we backtrack.

Complexity Analysis

The time complexity would be O(N) and the space complexity would also be O(N) due to the call stack.

C++ Programming 

#include<bits/stdc++.h>
using namespace std;

struct TreeNode
{
    int val;
    vector<TreeNode*> children;

    TreeNode(int val) {
        this->val = val;
    }
};

// print the tree
void preOrder(TreeNode* root)
{
    // base case
    if (root == nullptr) {
        return;
    }

    cout << root->val << ' ';
    for (TreeNode* children: root->children) {
        preOrder(children);
    }
}

void solve(TreeNode* root)
{
    // base case
    if (!root) {
        return;
    }

    // DFS on each child
    for (TreeNode* children: root->children) {
        solve(children);
    }

    // Reverse the order of the elements in the children
    reverse(root->children.begin(), root->children.end());
}

int main()
{
    TreeNode* root = new TreeNode(1);
    (root->children).push_back(new TreeNode(2));
    (root->children).push_back(new TreeNode(3));
    (root->children).push_back(new TreeNode(4));

    solve(root);
    preOrder(root);

    return 0;
}

Output

1 4 3 2

Java Programming 

import java.util.ArrayList;
import java.util.List;

class TreeNode
{
    int val;
    List<TreeNode> children;

    TreeNode(int val)
    {
        this.val = val;
        children = new ArrayList<>();
    }
}

class Main
{
    public static void inOrder(TreeNode root)
    {
        // base case
        if (root == null) {
            return;
        }

        // print the current node
        System.out.print(root.val + " ");

        for (TreeNode children: root.children) {
            inOrder(children);
        }
    }

    public static void solve(TreeNode root)
    {
        // base case
        if (root == null) {
            return;
        }

        // DFS on all children
        for (TreeNode children: root.children) {
            solve(children);
        }

        // Reverse the order of the elements in the children
        int n = root.children.size();
        for (int i = 0, j = n - 1; i < j; i++, j--)
        {
            TreeNode temp = root.children.get(i);
            root.children.set(i, root.children.get(j));
            root.children.set(j, temp);
        }
    }

    public static void main(String[] args)
    {
        // construct an m–ary tree
        TreeNode root = new TreeNode(1);
        (root.children).add(new TreeNode(2));
        (root.children).add(new TreeNode(3));
        (root.children).add(new TreeNode(4));

        solve(root);

        inOrder(root);
    }
}

Output

1 4 3 2

Python Programming 

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.children = list()

def preOrder(root):
    # base case
    if root is None:
        return

    # print the current node
    print(root.val, end=' ')

    # recur for all children nodes from left to right
    for c in root.children:
        preOrder(c)

# Recursive function to convert an m–ary tree into its mirror image
def swap(children, i, j):
    x = children[i]
    children[i] = children[j]
    children[j] = x

def solve(root):
    # base case
    if root is None:
        return

    # DFS for each children
    for c in root.children:
        solve(c)

    # Reverse the order of the elements in the children
    n = len(root.children)

    for i in range(n//2):
        swap(root.children, i, n - i - 1)

root = TreeNode(1)

(root.children).append(TreeNode(2))
(root.children).append(TreeNode(3))
(root.children).append(TreeNode(4)) 
solve(root)
preOrder(root)

Output

1 4 3 2

People are also reading:

Author: Vinay Singh

I am a Full Stack Developer with a Bachelor's Degree in Computer Science, who also loves to write technical articles that can help fellow developers.

Leave a Reply

Your email address will not be published.