2471. Nombre minimum d'opérations pour trier un arbre binaire par niveau
Difficulté :Moyen
Sujets : Arbre, recherche en largeur d'abord, arbre binaire
Vous recevez la racine d'un arbre binaire avec valeurs uniques.
En une seule opération, vous pouvez choisir deux nœuds au même niveau et échanger leurs valeurs.
Renvoyer le nombre minimum d'opérations nécessaires pour trier les valeurs de chaque niveau dans un ordre strictement croissant.
Le niveau d'un nœud est le nombre d'arêtes le long du chemin entre celui-ci et le nœud racine.
Exemple 1 :
Exemple 2 :
Exemple 3 :
Contraintes :
Indice :
Solution :
Le problème consiste à trier les valeurs d'un arbre binaire niveau par niveau dans un ordre strictement croissant avec le nombre minimum d'opérations. Dans chaque opération, nous pouvons échanger les valeurs de deux nœuds qui sont au même niveau. L'objectif est de déterminer le nombre minimum de ces opérations nécessaires pour atteindre l'ordre trié.
Implémentons cette solution en PHP : 2471. Nombre minimum d'opérations pour trier un arbre binaire par niveau
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?> <h3> Explication: </h3> <ol> <li> <p><strong>Étape 1 : Effectuer BFS pour regrouper les nœuds par niveau</strong> :</p> <ul> <li>Partez de la racine et parcourez l'arbre niveau par niveau.</li> <li>Pour chaque nœud, ajoutez sa valeur au niveau correspondant dans le tableau des niveaux.</li> </ul> </li> <li> <p><strong>Étape 2 : Pour chaque niveau, calculez les swaps minimum pour trier les valeurs</strong> :</p> <ul> <li>Trier les valeurs à chaque niveau.</li> <li>Utilisez une approche basée sur le cycle pour calculer les échanges minimaux requis pour transformer le niveau actuel en un niveau trié.</li> </ul> </li> <li> <p><strong>Décomposition du cycle</strong> :</p> <ul> <li>Pour chaque élément non trié, tracez son cycle (c'est-à-dire où il doit aller) et marquez les éléments comme visités.</li> <li>Pour chaque cycle, le nombre d'échanges requis est la durée du cycle moins un.</li> </ul> </li> <li> <p><strong>Renvoyer le nombre total d'échanges</strong> :</p> <ul> <li>Sommez les échanges nécessaires pour chaque niveau et renvoyez le total.</li> </ul> </li> </ol> <h3> Exemple de procédure pas à pas : </h3> <h4> Exemple 1 : </h4> <p>Arbre de saisie :<br> </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
Niveaux :
Niveau 1 : [4, 3]
Niveau 2 : [7, 6, 8, 5]
Niveau 3 : [9, 10]
Total des échanges = 1 (Niveau 1) 2 (Niveau 2) = 3 échanges.
Sortie : 3
Arbre de saisie :
1 / \ 4 3 / \ / \ 7 6 8 5 \ 9 \ 10
Niveaux :
Niveau 1 : [3, 2]
Niveau 2 : [7, 6, 5, 4]
Total des échanges = 1 (Niveau 1) 2 (Niveau 2) = 3 échanges.
Sortie : 3
Ainsi, la complexité temporelle globale est O(N log N), ce qui est suffisamment efficace compte tenu des contraintes.
Pour l'arborescence d'entrée :
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
Le résultat est de 3 échanges, comme détaillé dans l'exemple.
Cette solution calcule efficacement le nombre minimum de swaps nécessaires pour trier chaque niveau de l'arbre binaire en utilisant BFS pour regrouper les nœuds par niveau et par décomposition en cycle afin de minimiser le nombre de swaps. La complexité temporelle de O(N log N) est optimale pour gérer des arbres avec jusqu'à 10^5 nœuds.
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!