Traverse the matrix in Diagonally Bottom-Up fashion using Recursion

Given a matrix mat[][] of size N x N, the task is to traverse the matrix Diagonally in Bottom-up fashion using recursion.
Diagonally Bottom-up Traversal:Â
- Traverse the major-diagonal of the matrix.
- Traverse the bottom diagonal to the major-diagonal of the matrix.
- Traverse the up diagonal to the major-diagonal of the matrix.
- Similarly, Traverse the matrix for every diagonal.
The below image shows the Bottom-up Traversal of the matrix.Â
Â
Examples:Â
Â
Input:
M[][] = {{11, 42, 25, 51},
{14, 17, 61, 23},
{22, 38, 19, 12},
{27, 81, 29, 71}}
Output:
11 17 19 71
14 38 29
42 61 12
22 81
25 23
27
51
Input:
M[][] = {{3, 2, 5},
{4, 7, 6},
{2, 8, 9}}
Output:
3 7 9
4 8
2 6
2
5
Approach: The idea is to traverse the major-diagonal elements of the matrix and then recursively call the for the bottom diagonal of the matrix and the diagonal above to the major-diagonal of the matrix. Recursive Definition of the approach is described as follows:
- Function Definition: For this problem, there will be the following arguments as follows:Â
- mat[][] // Matrix to be Traversed
- Current Row (say i) // Current Row to be Traversed
- Current Column (say j) // Current Column to be Traversed
- Number of rows (say row)
- Number of columns (say col)
- Base Case: The base case for this problem can be when the current row or the current column is out of bounds. In this case, traverse the other bottom diagonal, or if the bottom diagonal is chosen last time then traverse the major-diagonal just above it.
if (i >= row or j >= col)
if (flag)
// Change the Current index
// to the bottom diagonal
else
// Change the current index
// to the up diagonal of matrix
- Recursive Case: There will be two cases of the recursive traversal of the matrix which is defined as follows:Â
- Traversal of the Current Diagonal: To traverse the current diagonal increment the current row and column by 1 at the same time and recursively call the function.
- Traversal of Bottom / Up Diagonal: To traverse the bottom / up diagonal call the recursive function with the static variables storing the next traversal start point of the matrix.
Below is the implementation of the above approach:Â
Â
C++
// C++ implementation to traverse the// matrix in the bottom-up fashion// using RecursionÂ
#include <iostream>Â
using namespace std;Â
// Recursive function to traverse the// matrix Diagonally Bottom-upbool traverseMatrixDiagonally(int m[][5],           int i, int j, int row, int col){         // Static variable for changing    // Row and column    static int k1 = 0, k2 = 0;         // Flag variable for handling    // Bottom up diagonal traversing    static bool flag = true;         // Base Condition    if (i >= row || j >= col) {                 // Condition when to traverse        // Bottom Diagonal of the matrix        if (flag) {            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;            k1++;        }        else {Â
            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;        }        cout << endl;        return false;    }         // Print matrix cell value    cout << m[i][j] << " ";         // Recursive function to traverse    // The matrix diagonally    if (traverseMatrixDiagonally(           m, i + 1, j + 1, row, col)) {        return true;    }    // Recursive function     // to change diagonal    if (traverseMatrixDiagonally(            m, k1, k2, row, col)) {        return true;    }         return true;}Â
// Driver Codeint main(){    // Initialize the 5 x 5 matrix    int mtrx[5][5] = {        { 10, 11, 12, 13, 14 },        { 15, 16, 17, 18, 19 },        { 20, 21, 22, 23, 24 },        { 25, 26, 27, 28, 29 },        { 30, 31, 32, 33, 34 }    };Â
    // Function call     // for traversing matrix    traverseMatrixDiagonally(            mtrx, 0, 0, 5, 5);} |
Java
// Java implementation to traverse // the matrix in the bottom-up // fashion using recursionclass GFG{Â Â Â Â Â // Static variable for changing// row and columnstatic int k1 = 0, k2 = 0;Â
// Flag variable for handling// bottom up diagonal traversingstatic boolean flag = true; Â
// Recursive function to traverse the// matrix diagonally bottom-upstatic boolean traverseMatrixDiagonally(int m[][], int i,                                        int j, int row,                                        int col){         // Base Condition    if (i >= row || j >= col)    {                 // Condition when to traverse        // Bottom Diagonal of the matrix        if (flag)        {            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;            k1++;        }        else        {            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;        }                 System.out.println();        return false;    }         // Print matrix cell value    System.out.print(m[i][j] + " ");         // Recursive function to traverse    // The matrix diagonally    if (traverseMatrixDiagonally(m, i + 1,                                    j + 1, row, col))    {        return true;    }         // Recursive function     // to change diagonal    if (traverseMatrixDiagonally(m, k1, k2, row, col))    {        return true;    }         return true;}Â
// Driver Codepublic static void main(String[] args){    // Initialize the 5 x 5 matrix    int mtrx[][] = { { 10, 11, 12, 13, 14 },                     { 15, 16, 17, 18, 19 },                     { 20, 21, 22, 23, 24 },                     { 25, 26, 27, 28, 29 },                     { 30, 31, 32, 33, 34 } };Â
    // Function call     // for traversing matrix    traverseMatrixDiagonally(mtrx, 0, 0, 5, 5);}}Â
// This code is contributed by sapnasingh4991 |
Python3
# Python3 implementation to traverse the # matrix in the bottom-up fashion # using RecursionÂ
# Static variable for changing # Row and columnk1 = 0k2 = 0Â
# Flag variable for handling # Bottom up diagonal traversingflag = TrueÂ
# Recursive function to traverse the # matrix Diagonally Bottom-updef traverseMatrixDiagonally(m, i, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â j, row, col):Â Â Â Â global k1Â Â Â Â global k2Â Â Â Â global flagÂ
    # Base Condition    if(i >= row or j >= col):Â
        # Condition when to traverse         # Bottom Diagonal of the matrix        if(flag):            a = k1             k1 = k2            k2 = a            if(flag):                flag = False            else:                flag = True            k1 += 1        else:            a = k1            k1 = k2            k2 = a            if(flag):                flag = False            else:                flag = True        print()        return False           # Print matrix cell value    print(m[i][j], end = " ")Â
    # Recursive function to traverse     # The matrix diagonally    if (traverseMatrixDiagonally(m, i + 1,                                  j + 1,                                  row, col)):        return TrueÂ
    # Recursive function     # to change diagonal    if(traverseMatrixDiagonally(m, k1,                                 k2, row, col)):        return True    return TrueÂ
# Driver CodeÂ
# Initialize the 5 x 5 matrixmtrx=[[10, 11, 12, 13, 14],      [15, 16, 17, 18, 19],      [20, 21, 22, 23, 24],      [25, 26, 27, 28, 29],      [30, 31, 32, 33, 34]]Â
# Function call # for traversing matrixtraverseMatrixDiagonally(mtrx, 0,                          0, 5, 5)Â
#This code is contributed by avanitrachhadiya2155 |
C#
// C# implementation to traverse // the matrix in the bottom-up // fashion using recursionusing System;Â
class GFG{Â Â Â Â Â // Static variable for changing// row and columnstatic int k1 = 0, k2 = 0;Â
// Flag variable for handling// bottom up diagonal traversingstatic bool flag = true; Â
// Recursive function to traverse the// matrix diagonally bottom-upstatic bool traverseMatrixDiagonally(int [,]m, int i,                                     int j, int row,                                     int col){         // Base Condition    if (i >= row || j >= col)    {                 // Condition when to traverse        // Bottom Diagonal of the matrix        if (flag)        {            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;            k1++;        }        else        {            int a = k1;            k1 = k2;            k2 = a;            flag = !flag;        }                 Console.WriteLine();        return false;    }         // Print matrix cell value    Console.Write(m[i, j] + " ");         // Recursive function to traverse    // The matrix diagonally    if (traverseMatrixDiagonally(m, i + 1,                                    j + 1, row, col))    {        return true;    }         // Recursive function     // to change diagonal    if (traverseMatrixDiagonally(m, k1, k2, row, col))    {        return true;    }    return true;}Â
// Driver Codepublic static void Main(String[] args){         // Initialize the 5 x 5 matrix    int [,]mtrx = { { 10, 11, 12, 13, 14 },                    { 15, 16, 17, 18, 19 },                    { 20, 21, 22, 23, 24 },                    { 25, 26, 27, 28, 29 },                    { 30, 31, 32, 33, 34 } };Â
    // Function call for     // traversing matrix    traverseMatrixDiagonally(mtrx, 0, 0, 5, 5);}}Â
// This code is contributed by Amit Katiyar |
Javascript
<script>// Java script implementation to traverse// the matrix in the bottom-up// fashion using recursionÂ
     // Static variable for changing// row and columnlet k1 = 0, k2 = 0;Â
// Flag variable for handling// bottom up diagonal traversinglet flag = true;Â
// Recursive function to traverse the// matrix diagonally bottom-upfunction traverseMatrixDiagonally(m,i,j,row,col){         // Base Condition    if (i >= row || j >= col)    {                 // Condition when to traverse        // Bottom Diagonal of the matrix        if (flag)        {            let a = k1;            k1 = k2;            k2 = a;            flag = !flag;            k1++;        }        else        {            let a = k1;            k1 = k2;            k2 = a;            flag = !flag;        }                 document.write("<br>");        return false;    }         // Print matrix cell value    document.write(m[i][j] + " ");         // Recursive function to traverse    // The matrix diagonally    if (traverseMatrixDiagonally(m, i + 1,                                    j + 1, row, col))    {        return true;    }         // Recursive function    // to change diagonal    if (traverseMatrixDiagonally(m, k1, k2, row, col))    {        return true;    }         return true;}Â
// Driver CodeÂ
    // Initialize the 5 x 5 matrix    let mtrx = [[ 10, 11, 12, 13, 14 ],                    [ 15, 16, 17, 18, 19 ],                    [ 20, 21, 22, 23, 24 ],                    [ 25, 26, 27, 28, 29 ],                    [ 30, 31, 32, 33, 34 ]];Â
    // Function call    // for traversing matrix    traverseMatrixDiagonally(mtrx, 0, 0, 5, 5);Â
Â
//This code is contributed by sravan kumar</script> |
10 16 22 28 34 15 21 27 33 11 17 23 29 20 26 32 12 18 24 25 31 13 19 30 14
Time Complexity: O(N2)
The time complexity of the above algorithm is O(N^2) where N is the number of the elements in the matrix. This is because the algorithm recursively calls itself for each element of the matrix.
Space Complexity: O(N)
The space complexity of the above algorithm is O(N) where N is the number of elements in the matrix. This is because the algorithm uses recursive calls to traverse the matrix.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!




