Comprimir un árbol binario en un entero en diagonal

Dado un árbol binario que consta de N Nodes, la tarea es primero comprimir el árbol en diagonal para obtener una lista de enteros y luego comprimir nuevamente la lista para obtener un solo entero usando las siguientes operaciones:

  • Cuando un árbol se comprime en diagonal, su valor en representación binaria se comprime.
  • Considere cada posición de bit de cada valor de Node presente en una diagonal. Si una posición tiene S bits activados y NS bits no activados, establezca el bit para esa posición solo si S es mayor que NS . De lo contrario, desactive el bit para esa posición.
  • Comprima cada diagonal para convertir el árbol en una lista. Luego, comprima cada elemento de la array en un solo entero usando el mismo proceso.

Ejemplo: si 7, 6, 3 y 4 se comprimen, entonces sus representaciones binarias, es decir, (111) 2 , (110) 2 , (011) 2 y (100) 2 se comprimen. Para la posición 0 , S NS y para las posiciones 1 y 2 , S > NS
Por lo tanto, el número se convierte en (110) 2 = 6 .

Ejemplos:

Entrada:                6
                     / \
                  5 3
              / \ / \
           3 5 3 4
Salida: 3
Explicación: 

Diagonal 1: Comprimir (6, 3, 4) = 6
Diagonal 2: Comprimir (5, 5, 3) = 5
Diagonal 3: Comprimir (3) = 3
Finalmente, comprima la lista (6, 5, 3) para obtener 7 .

Entrada:                10
                      / \
                  5 2
              / \
           6 8
Salida: 2

Enfoque: La idea es usar un Hashmap para almacenar todos los Nodes que pertenecen a una diagonal particular del árbol. Siga los pasos a continuación para resolver el problema:

  • Para el recorrido diagonal del árbol , realice un seguimiento de la distancia horizontal desde el Node raíz para cada Node.
  • Usa un Hashmap para almacenar los elementos que pertenecen a la misma diagonal.
  • Después del recorrido, cuente el número de bits establecidos para cada posición de cada diagonal del árbol y establezca el bit para las posiciones donde el número de bits establecidos excede el número de bits no establecidos.
  • Almacene el valor comprimido de cada diagonal en una array .
  • Después de obtener la array, aplique los mismos pasos de compresión para obtener el número entero requerido.

A continuación se muestra la implementación del enfoque anterior:

C++

#include <bits/stdc++.h>
 
using namespace std;
 
struct TreeNode{
  int val;
  TreeNode *left,*right;
 
    TreeNode(int v){
        val = v;
        left = NULL;
        right = NULL;
    }
};
 
// Function to compress the elements
// in an array into an integer
int findCompressValue(vector<int> arr){
    int ans = 0;
    int getBit = 1;
 
    // Check for each bit position
    for (int i = 0; i < 32; i++){
        int S = 0;
        int NS = 0;
 
        for (int j:arr){
 
            // Update the count of
            // set and non-set bits
            if (getBit & j)
                S += 1;
            else
                NS += 1;
          }
 
        // If number of set bits exceeds
        // the number of non-set bits,
        // then add set bits value to ans
        if (S > NS)
            ans += pow(2,i);
 
        getBit <<= 1;
      }
    return ans;
}
 
// Perform Inorder Traversal
// on the Binary Tree
void diagonalOrder(TreeNode *root,int d,map<int,vector<int> > &mp){
    if (!root)
        return;
 
    // Store all nodes of the same
    // line together as a vector
    mp[d].push_back(root->val);
 
    // Increase the vertical
    // distance of left child
    diagonalOrder(root->left, d + 1, mp);
 
    // Vertical distance remains
    // same for right child
    diagonalOrder(root->right, d, mp);
}
 
// Function to compress a given
// Binary Tree into an integer
int findInteger(TreeNode *root){
 
    // Declare a map
    map<int,vector<int> > mp;
 
    diagonalOrder(root, 0, mp);
 
    //Store all the compressed values of
    //diagonal elements in an array
    vector<int> arr;
 
    for (auto i:mp)
        arr.push_back(findCompressValue(i.second));
 
    // Compress the array into an integer
    return findCompressValue(arr);
}
 
// Driver Code
// Given Input
int main()
{
  TreeNode *root = new TreeNode(6);
  root->left = new TreeNode(5);
  root->right = new TreeNode(3);
  root->left->left = new TreeNode(3);
  root->left->right = new TreeNode(5);
  root->right->left = new TreeNode(3);
  root->right->right = new TreeNode(4);
 
  // Function Call
  cout << findInteger(root);
 
  return 0;
}
 
// This code is contributed by mohit kumar 29.

Python3

# Python program for the above approach
 
class TreeNode:
 
    def __init__(self, val ='',
                 left = None,
                 right = None):
        self.val = val
        self.left = left
        self.right = right
 
# Function to compress the elements
# in an array into an integer
def findCompressValue(arr):
    ans = 0
    getBit = 1
 
    # Check for each bit position
    for i in range(32):
        S = 0
        NS = 0
 
        for j in arr:
 
            # Update the count of
            # set and non-set bits
            if getBit & j:
                S += 1
            else:
                NS += 1
 
        # If number of set bits exceeds
        # the number of non-set bits,
        # then add set bits value to ans
        if S > NS:
            ans += 2**i
 
        getBit <<= 1
 
    return ans
 
# Function to compress a given
# Binary Tree into an integer
def findInteger(root):
 
    # Declare a map
    mp = {}
 
    # Perform Inorder Traversal
    # on the Binary Tree
    def diagonalOrder(root, d, mp):
        if not root:
            return
 
        # Store all nodes of the same
        # line together as a vector
        try:
            mp[d].append(root.val)
 
        except KeyError:
            mp[d] = [root.val]
 
        # Increase the vertical
        # distance of left child
        diagonalOrder(root.left, d + 1, mp)
 
        # Vertical distance remains
        # same for right child
        diagonalOrder(root.right, d, mp)
 
    diagonalOrder(root, 0, mp)
 
    # Store all the compressed values of
    # diagonal elements in an array
    arr = []
    for i in mp:
        arr.append(findCompressValue(mp[i]))
 
    # Compress the array into an integer
    return findCompressValue(arr)
 
 
# Driver Code
# Given Input
root = TreeNode(6)
root.left = TreeNode(5)
root.right = TreeNode(3)
root.left.left = TreeNode(3)
root.left.right = TreeNode(5)
root.right.left = TreeNode(3)
root.right.right = TreeNode(4)
 
# Function Call
print(findInteger(root))
Producción: 

7

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por rohitsingh07052 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *