ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਟਰੀ ਲੀਟਕੋਡ ਹੱਲ


ਮੁਸ਼ਕਲ ਪੱਧਰ ਸੌਖੀ
ਅਕਸਰ ਪੁੱਛਿਆ ਜਾਂਦਾ ਹੈ ਐਮਾਜ਼ਾਨ ਗੂਗਲ Microsoft ਦੇ
ਅਰੇ

A ਬਾਈਨਰੀ ਟਰੀ ਕੀ ਉਚਾਈ ਸੰਤੁਲਿਤ ਹੈ ਜੇ ਰੁੱਖ ਦੇ ਹਰ ਨੋਡ ਦੇ ਖੱਬੇ ਅਤੇ ਸੱਜੇ ਉਪਸਰੀ ਦੀ ਉਚਾਈ ਦਾ ਅੰਤਰ ਘੱਟੋ ਘੱਟ 1 ਹੁੰਦਾ ਹੈ. ਇਸ ਸਮੱਸਿਆ ਵਿਚ, ਅਸੀਂ ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਰੁੱਖ ਦੀ ਜਾਂਚ ਕਰਨ ਜਾ ਰਹੇ ਹਾਂ.

ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਟਰੀ ਲੀਟਕੋਡ ਹੱਲ

ਉਦਾਹਰਨ

             2
        
          / 
    
        1

      /
 
    4
Not balanced
     1

  /     \

2         3
Balanced

ਪਹੁੰਚ

ਇਹ ਸੋਚਣਾ ਸੁਭਾਵਿਕ ਹੈ ਕਿ, ਇਸ ਲਈ ਹਰ ਬਾਈਨਰੀ ਟਰੀ ਵਿਚ ਨੋਡ, ਅਸੀਂ ਜਾਂਚ ਕਰ ਸਕਦੇ ਹਾਂ ਕਿ ਖੱਬੇ ਅਤੇ ਸੱਜੇ ਉਪ-ਟ੍ਰੀ ਲੋੜੀਂਦੀ ਸਥਿਤੀ ਦਾ ਪਾਲਣ ਕਰਦੇ ਹਨ ਜਾਂ ਨਹੀਂ. ਇਹ ਹੈ “ਬਰੂਟ ਫੋਰਸ”.ੰਗ.

ਪਰ, ਇਹ ਦਰਖਾਸਤ ਦੇਣ ਲਈ ਕਿ ਦਰੱਖਤ ਸੰਤੁਲਿਤ ਹੈ ਜਾਂ ਨਹੀਂ, ਦੇ ਅਧਾਰ ਤੇ ਪਹੁੰਚ ਨੂੰ ਸੁਧਾਰਿਆ ਜਾ ਸਕਦਾ ਹੈ ਸਮਾਂ ਅਤੇ ਸਪੇਸ ਪੇਚੀਦਗੀਆਂ.

ਅਸੀਂ ਅਜਿਹੀ ਪਹੁੰਚ ਦੀ ਪਾਲਣਾ ਕਰਦੇ ਹਾਂ ਕਿ ਅਸੀਂ ਸਮੱਸਿਆ ਨੂੰ ਏ ਵਿਚ ਹੱਲ ਕਰਦੇ ਹਾਂ ਤਲ-ਉੱਪਰ .ੰਗ ਨਾਲ. ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਨੋਡ ਦੇ ਉਪਸਰੀ ਆਪਣੇ ਆਪ ਹਨ, ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਰੁੱਖ(ਜਾਂ ਨਹੀਂ) ਅਤੇ ਉਸੇ ਸਮੇਂ ਬਾਈਨਰੀ ਰੁੱਖ ਦੀ ਉਚਾਈ ਪ੍ਰਾਪਤ ਕਰੋ, ਜਿਸ ਨੂੰ ਦੁਹਰਾਓ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਮ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ.

ਐਲਗੋਰਿਦਮ (ਬਰੂਟ ਫੋਰਸ)

  1. ਰੂਟ ਤੋਂ ਅਰੰਭ ਕਰੋ ਅਤੇ ਬਾਈਨਰੀ ਟਰੀ ਨੂੰ ਪਾਰ ਕਰਦੇ ਸਮੇਂ ਤਕ ਰੂਟ ਬਣੋ NULL
  2. ਇਸਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਖੱਬੇ ਅਤੇ ਸੱਜੇ ਉਪ-ਟ੍ਰੀਸ ਦੀ ਉਚਾਈ ਪ੍ਰਾਪਤ ਕਰੋ ਉਚਾਈ () ਫੰਕਸ਼ਨ
    • ਜੇ ਫਰਕ ਵੱਧ ਹੈ '1':
      • ਵਾਪਸ ਗਲਤ. ਜਿਵੇਂ ਕਿ ਰੁੱਖ ਸੰਤੁਲਨ ਦੀ ਸਥਿਤੀ ਨੂੰ ਪੂਰਾ ਨਹੀਂ ਕਰਦਾ
    • ਖੱਬੇ ਅਤੇ ਸੱਜੇ ਸਬਟ੍ਰੀਸ ਲਈ ਲਗਾਤਾਰ ਸੰਤੁਲਨ ਸਥਿਤੀ ਦੀ ਜਾਂਚ ਕਰੋ
  3. ਨਤੀਜਾ ਪ੍ਰਿੰਟ ਕਰੋ

ਐਲਗੋਰਿਦਮ (ਅਨੁਕੂਲ)

  1. ਜੇ ਰੁੱਖ ਹੈ ਖਾਲੀ, ਅਸੀਂ ਕਹਿ ਸਕਦੇ ਹਾਂ ਕਿ ਇਹ ਸੰਤੁਲਿਤ ਹੈ. ਜੇ ਨਹੀਂ, ਤਾਂ ਅਸੀਂ ਦੂਜੇ ਕਦਮਾਂ ਦੀ ਪਾਲਣਾ ਕਰ ਸਕਦੇ ਹਾਂ:
  2. ਵਾਪਸ ਕਰਨ ਲਈ ਇੱਕ ਸਹਾਇਤਾ ਕਾਰਜ ਬਣਾਓ “ਉਚਾਈਇੱਕ ਮੌਜੂਦਾ ਸਬਟ੍ਰੀ ਦਾ, ਮੁੜ ਵਰਤ ਕੇ.
  3. ਕੱਦ ਦਾ ਕੰਮ ਵਾਪਸ ਆਵੇਗਾ:
    • -1, ਜਦੋਂ ਇਹ ਇੱਕ ਅਸੰਤੁਲਿਤ ਰੁੱਖ ਹੈ
    • ਉਚਾਈ ਨਹੀਂ ਤਾਂ.
  4. ਜੇ ਉਪਸਰੀ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਉਪਸਰੀ ਹੈ ਅਸੰਤੁਲਿਤ, ਜਾਂ ਉਨ੍ਹਾਂ ਦੀਆਂ ਉਚਾਈਆਂ '1' ਤੋਂ ਵੱਧ, ਵਾਪਸੀ -1 ਦੁਆਰਾ ਵੱਖਰੀਆਂ ਹਨ.
  5. ਨਹੀਂ ਤਾਂ, ਇਸ ਸਬਟ੍ਰੀ ਦੀ ਉਚਾਈ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਵਾਪਸ ਕਰੋ: 1 + ਅਧਿਕਤਮ (ਖੱਬੇ ਹਿੱਸੇ, ਸੱਜੇ ਪਾਸੇ)

ਲਾਗੂ

ਸੀ ++ ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਟਰੀ ਲੀਟਕੋਡ ਹੱਲ ਦਾ ਪ੍ਰੋਗਰਾਮ

ਜ਼ਖਮ ਫੋਰਸ odੰਗ

#include <bits/stdc++.h>
using namespace std;
struct treeNode
{
    int value;
    treeNode *left , *right;
    treeNode(int x)
    {
        value = x;
        left = NULL;
        right = NULL;
    }
};


int height(treeNode* root)
{
    if(root == NULL)
        return 0;
    return max(height(root->left) , height(root->right)) + 1;
}


bool balanced(treeNode* root)
{
    if(root == NULL)
    return true;

    int l = height(root->left) , r = height(root->right);
    //calling height function at every node
    if(abs(l - r) > 1)
        return false;

    return balanced(root->left) && balanced(root->right);
}


int main()
{
    treeNode* root = new treeNode(2);
    root->left = new treeNode(2);
    root->left->left = new treeNode(4);
    
    if(balanced(root))
        cout << "Balanced" << '\n';
    else
        cout << "Not Balanced" << '\n';
    return 0;
}

ਅਨੁਕੂਲ ਵਿਧੀ

#include <bits/stdc++.h>
using namespace std;
struct treeNode
{
    int value;
    treeNode *left , *right;
    treeNode(int x)
    {
        value = x;
        left = NULL;
        right = NULL;
    }
};


int height(treeNode* root)
{
    if(root == NULL)
        return 0;
    int l = height(root->left);
    int r = height(root->right);
    if(l == -1 || r == -1 || abs(l - r) > 1)
        return -1;
    return max(l , r) + 1;
}


bool balanced(treeNode* root)
{
    if(root == NULL)
        return true;

    return (height(root) != -1);
}


int main()
{
    treeNode* root = new treeNode(2);
    root->left = new treeNode(2);
    root->left->left = new treeNode(4);

    if(balanced(root))
        cout << "Balanced" << '\n';
    else
        cout << "Not Balanced" << '\n';
    return 0;
}
Not Balanced

ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਟਰੀ ਲੀਟਕੋਡ ਹੱਲ ਦਾ ਜਾਵਾ ਪ੍ਰੋਗਰਾਮ

ਬਰੂਟ ਫੋਰਸ

import java.lang.Math;

class treeNode
{
    int value;
    treeNode left, right;

    public treeNode(int x)
    {
        value= x;
        left = right = null;
    }
}

class balanced_binary_tree
{
    public static int height(treeNode root)
    {
        if(root == null)
            return 0;
        return Math.max(height(root.left) , height(root.right)) + 1;
    }


    public static boolean balanced(treeNode root)
    {
        if(root == null)
            return true;

        int l = height(root.left) , r = height(root.right);
        if(Math.abs(r - l) > 1)
            return false;
        return balanced(root.left) && balanced(root.right);
    }


    public static void main(String args[])
    {
        treeNode root = new treeNode(2);
        root.left = new treeNode(1);
        root.right = new treeNode(3);

        if(balanced(root))
            System.out.println("Balanced");
        else
            System.out.println("Not Balanced");
    }
}

ਅਨੁਕੂਲ ਵਿਧੀ

import java.lang.Math;

class treeNode
{
    int value;
    treeNode left, right;

    public treeNode(int x)
    {
        value= x;
        left = right = null;
    }
}

class balanced_binary_tree
{
    public static int height(treeNode root)
    {
        if(root == null)
            return 0;

        int l = height(root.left);
        int r = height(root.right);

        if(l == -1 || r == -1 || Math.abs(l - r) > 1)
            return -1;

        return Math.max(l , r) + 1;
    }


    public static boolean balanced(treeNode root)
    {
        if(root == null)
            return true;

        return (height(root) != -1);
    }


    public static void main(String args[])
    {
        treeNode root = new treeNode(2);
        root.left = new treeNode(1);
        root.left.left = new treeNode(4);

        if(balanced(root))
            System.out.println("Balanced");
        else
            System.out.println("Not Balanced");
    }
}
Not Balanced

ਸੰਤੁਲਿਤ ਬਾਈਨਰੀ ਟਰੀ ਲੀਟਕੋਡ ਹੱਲ ਦਾ ਜਟਿਲਤਾ ਵਿਸ਼ਲੇਸ਼ਣ

ਟਾਈਮ ਜਟਿਲਤਾ

ਬਰੂਟ ਫੋਰਸ ਵਿਧੀ ਦੀ ਸਮੇਂ ਦੀ ਗੁੰਝਲਤਾ ਹੈ ਓ (ਐਨ * ਐਨ), ਸਭ ਤੋਂ ਮਾੜੇ ਹਾਲਾਤਾਂ ਵਿੱਚ (ਸਕਿ tree ਰੁੱਖ). ਹਾਲਾਂਕਿ, ਅਨੁਕੂਲ ਪਹੁੰਚ ਵਿੱਚ ਕੰਮ ਕਰਦਾ ਹੈ ਓ (ਐਨ) ਸਮਾਂ ਸਿਰਫ ਜਦੋਂ ਅਸੀਂ ਇਕੋ ਪਾਸ ਕਰਦੇ ਹਾਂ.

ਸਪੇਸ ਦੀ ਜਟਿਲਤਾ

ਓ (ਐੱਨ) ਦੋਵਾਂ ਮਾਮਲਿਆਂ ਵਿਚ, ਜਿਵੇਂ ਕਿ ਦੁਹਰਾਉਣਾ ਸਹਾਇਕ ਸਟੈਕ ਸਪੇਸ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ.