Table des matières
Comprendre le problème
Traversée utilisant la recherche en profondeur d'abord
Exemple
Sortie
Conclusion
Maison développement back-end C++ Le nombre de triangles isocèles dans un arbre binaire

Le nombre de triangles isocèles dans un arbre binaire

Sep 05, 2023 am 09:41 AM
数量 二叉树 triangle isocèle

Un arbre binaire est une structure de données dans laquelle chaque nœud peut avoir jusqu'à deux nœuds enfants. Ces enfants sont appelés respectivement enfants de gauche et enfants de droite. Supposons que nous recevions une représentation de tableau parent, vous devez l'utiliser pour créer un arbre binaire. Un arbre binaire peut avoir plusieurs triangles isocèles. Nous devons trouver le nombre total de triangles isocèles possibles dans cet arbre binaire.

Dans cet article, nous explorerons plusieurs techniques pour résoudre ce problème en C++.

Comprendre le problème

Vous donne un tableau parent. Vous devez le représenter sous la forme d'un arbre binaire afin que l'index du tableau forme la valeur du nœud de l'arbre et que la valeur dans le tableau donne le nœud parent de cet index particulier.

Veuillez noter que -1 est toujours le nœud parent racine. Vous trouverez ci-dessous un tableau et sa représentation arborescente binaire.

Parent array = [0, -1, 3, 1, 1, 2, 2, 3, 4, 4]
Copier après la connexion

Arbre binaire -

Le nombre de triangles isocèles dans un arbre binaire

Dans n'importe quel arbre binaire, nous pouvons avoir trois types de triangles isocèles -

  • Triangle isocèle gauche Dans ce triangle, le sommet est un nœud enfant du nœud parent gauche , et les sommets qui forment la base (les deux côtés du triangle isocèle) sont à gauche nœud enfant. Les nœuds enfants peuvent être directs ou indirects. Dans l'arbre ci-dessus, nous avons deux de ces triangles isocèles - (2, 6, 3), (3, 7, 1).

  • Triangle isocèle droit Dans ce triangle, le sommet est le droit enfant du parent, tandis que le sommet formant la base est l'enfant droit du sommet. Les enfants peuvent être directs ou indirects. Dans l’arbre ci-dessus, nous n’avons qu’un seul de ces triangles isocèles (4, 1, 8).

  • Triangle isocèle équilibré Dans ce triangle, les sommets qui forment la base sont les nœuds enfants gauche et droit du nœud sommet. Dans l'arbre ci-dessus, nous avons cinq de ces triangles isocèles (1, 3, 4), (3, 2, 7), (4, 8, 9), (2, 5, 6), (1, 2, 9).

Donc, pour l'arbre binaire ci-dessus, nous avons un total de 8 triangles isocèles.

Traversée utilisant la recherche en profondeur d'abord

Depth First Search(DFS) est une méthode permettant de parcourir tous les nœuds d'un arbre de manière approfondie. Il commence au nœud racine, se déplace vers chaque branche, puis revient en arrière.

  • Tout d'abord, nous utilisons DFS pour parcourir chaque nœud de l'arbre binaire et le convertir en un graphique afin que chaque nœud soit représenté comme adjacent les uns aux autres. Cela facilite la traversée.

  • Pour chaque nœud, nous vérifions s'il a des nœuds enfants. Après vérification, nous les trions à l'aide de la fonction sort(node[x].begin(), node[x].end()).

  • Ensuite, nous vérifions si le nœud actuel est le successeur gauche ou droit de son nœud parent correspondant. Nous utilisons la fonction DFS de manière récursive sur tous les nœuds de l'arbre binaire.

  • Si le nœud courant a deux enfants (directs ou indirects), on vérifie la possibilité qu'un triangle isocèle existe en calculant les arêtes entre eux. Nous retrouverons les arêtes entre eux grâce à la fonction graph donnée dans le code ci-dessous.

  • Enfin, nous calculons le nombre total de triangles isocèles en additionnant tous les triangles possibles dans différentes positions.

Exemple

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

#define MAX int(1e5)
vector < int > * node;
int right_down[MAX];
int right_up[MAX];
int left_down[MAX];
int left_up[MAX];

// DFS traversal over a node
void DFS(int x, int * parent) {
   // Check if adjacent nodes are present for node x
   if (node[x].size() != 0)
      sort(node[x].begin(), node[x].end());

   // Check whether the node has a parent node
   if (parent[x] != -1) {
      int indexOfParent = parent[x];
      int childrenCount = node[indexOfParent].size();

      if (childrenCount > 1) {
         int parentFirstChild = node[indexOfParent][0];

         // Check if current node is left node of the parent
         if (x == parentFirstChild) {
            right_up[x] += right_up[indexOfParent] + 1;
            // Check if current node is right node of the parent  
         } else {
            left_up[x] += left_up[indexOfParent] + 1;
         }
      } else {
         right_up[x] += right_up[indexOfParent] + 1;
      }
   }

   // Iterate over children of current node  
   for (int i = 0; i < node[x].size(); ++i) {
      int y = node[x][i];
      DFS(y, parent);

      // left child of current node
      if (i == 0) {
         left_down[x] += left_down[y] + 1;
      }
      // right child of current node
      else {
         right_down[x] += right_down[y] + 1;
      }
   }
}

int graph(int * parent, int N) {
   int rootNode;
   node = new vector < int > [N];

   for (int i = 0; i < N; ++i) {
      if (parent[i] != -1) {
         node[parent[i]].push_back(i);
      } else {
         rootNode = i;
      }

      left_up[i] = 0;
      right_up[i] = 0;
      left_down[i] = 0;
      right_down[i] = 0;
   }
   return rootNode;
}

int main() {
   int N = 10;
   int parent[] = { 0, -1, 3, 1, 1, 2, 2, 3, 4, 4 };
   int rootNode = graph(parent, N);
   DFS(rootNode, parent);
   int count = 0;
   // Counting the total isosceles triangles
   for (int i = 0; i < N; ++i) {
      count += min(right_down[i], right_up[i]);
      count += min(left_down[i], left_up[i]);
      count += min(left_down[i], right_down[i]);
   }
   cout << "Number of isosceles triangles in the binary tree are " <<
      count;
   return 0;
}
Copier après la connexion

Sortie

Number of isosceles triangles in the binary tree are 8
Copier après la connexion

Conclusion

Nous avons expliqué comment trouver le nombre total de triangles équilatéraux dans un arbre binaire lorsqu'on lui donne un tableau parent. Nous pouvons y parvenir en utilisant la recherche en profondeur d'abord, qui nous permet de parcourir un arbre binaire.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Mise à jour OpenOOD v1.5 : bibliothèque de codes de détection hors distribution complète et précise et plateforme de test, prenant en charge les classements en ligne et les tests en un clic Mise à jour OpenOOD v1.5 : bibliothèque de codes de détection hors distribution complète et précise et plateforme de test, prenant en charge les classements en ligne et les tests en un clic Jul 03, 2023 pm 04:41 PM

La détection hors distribution (OOD) est cruciale pour le fonctionnement fiable des systèmes intelligents en monde ouvert, mais les méthodes actuelles de détection orientée objet souffrent d'« incohérences d'évaluation » (incohérences d'évaluation). Travaux antérieurs OpenOODv1 unifie l'évaluation de la détection OOD, mais présente toujours des limites en termes d'évolutivité et de convivialité. Récemment, l'équipe de développement a de nouveau proposé OpenOODv1.5. Par rapport à la version précédente, la nouvelle évaluation de la méthode de détection OOD a été considérablement améliorée pour garantir la précision, la standardisation et la convivialité. Document d'image : https://arxiv.org/abs/2306.09301OpenOODCodebase:htt

Augmentez vos connaissances! Apprentissage automatique avec des règles logiques Augmentez vos connaissances! Apprentissage automatique avec des règles logiques Apr 01, 2023 pm 10:07 PM

Sur la courbe précision-rappel, les mêmes points sont tracés avec des axes différents. Attention : Le premier point rouge à gauche (0% de rappel, 100% de précision) correspond à 0 règle. Le deuxième point à gauche est la première règle, et ainsi de suite. Skope-rules utilise un modèle d'arborescence pour générer des règles candidates. Créez d’abord des arbres de décision et considérez les chemins allant du nœud racine aux nœuds internes ou aux nœuds feuilles comme candidats aux règles. Ces règles candidates sont ensuite filtrées selon certains critères prédéfinis tels que la précision et le rappel. Seuls ceux dont la précision et le rappel sont supérieurs à leurs seuils sont retenus. Enfin, un filtrage de similarité est appliqué pour sélectionner des règles présentant une diversité suffisante. En général, les règles Skope sont appliquées pour connaître la cause profonde de chaque problème.

Imprimer la vue gauche de l'arbre binaire en langage C Imprimer la vue gauche de l'arbre binaire en langage C Sep 03, 2023 pm 01:25 PM

La tâche consiste à imprimer le nœud gauche de l'arbre binaire donné. Tout d'abord, l'utilisateur insérera des données, générant ainsi un arbre binaire, puis imprimera la vue gauche de l'arbre résultant. Chaque nœud peut avoir au plus 2 nœuds enfants, donc ce programme doit parcourir uniquement le pointeur gauche associé au nœud. Si le pointeur gauche n'est pas nul, cela signifie qu'il aura des données ou un pointeur associé, sinon il sera imprimé et affiché comme l'enfant gauche de la sortie. ExempleInput:10324Output:102Ici, le nœud orange représente la vue gauche de l'arborescence binaire. Dans le graphique donné, le nœud avec les données 1 est le nœud racine, il sera donc imprimé et au lieu d'aller vers l'enfant de gauche, il imprimera 0, puis il ira à 3 et imprimera son enfant de gauche qui est 2. Nous pouvons utiliser une méthode récursive pour stocker le niveau du nœud

Explication détaillée de la structure arborescente binaire en Java Explication détaillée de la structure arborescente binaire en Java Jun 16, 2023 am 08:58 AM

L'arbre binaire est une structure de données courante en informatique et une structure de données couramment utilisée dans la programmation Java. Cet article présentera en détail la structure arborescente binaire en Java. 1. Qu'est-ce qu'un arbre binaire ? En informatique, un arbre binaire est une structure arborescente dans laquelle chaque nœud possède au plus deux nœuds enfants. Parmi eux, le nœud enfant gauche est plus petit que le nœud parent et le nœud enfant droit est plus grand que le nœud parent. Dans la programmation Java, les arbres binaires sont couramment utilisés pour représenter le tri, la recherche et l'amélioration de l'efficacité des requêtes de données. 2. Implémentation d'un arbre binaire en Java En Java, arbre binaire

Comment trouver le nombre de paramètres fournis par le runtime en Java ? Comment trouver le nombre de paramètres fournis par le runtime en Java ? Sep 23, 2023 pm 01:13 PM

En Java, une façon de transmettre des paramètres au moment de l'exécution consiste à utiliser la ligne de commande ou le terminal. Lors de la récupération de ces valeurs pour les paramètres de ligne de commande, nous devrons peut-être trouver le nombre de paramètres fournis par l'utilisateur au moment de l'exécution, ce qui peut être obtenu à l'aide de l'attribut length. Cet article vise à expliquer le processus de transmission et d'obtention d'un certain nombre de paramètres fournis par l'utilisateur à l'aide d'un exemple de programme. Obtenir le nombre d'arguments fournis par l'utilisateur au moment de l'exécution Avant de trouver le nombre d'arguments de ligne de commande, notre première étape consiste à créer un programme qui permet à l'utilisateur de transmettre des arguments au moment de l'exécution. Paramètre String[] Lors de l'écriture de programmes Java, nous rencontrons souvent la méthode main(). Lorsque la JVM appelle cette méthode, l'application Java commence à s'exécuter. Il est utilisé avec un argument appelé String[]args

Commande Linux : Comment vérifier le nombre de processus telnet Commande Linux : Comment vérifier le nombre de processus telnet Mar 01, 2024 am 11:39 AM

Les commandes Linux sont l'un des outils indispensables dans le travail quotidien des administrateurs système. Elles peuvent nous aider à accomplir diverses tâches de gestion du système. Lors des travaux d'exploitation et de maintenance, il est parfois nécessaire de vérifier le numéro d'un certain processus dans le système afin de détecter les problèmes et de procéder à des ajustements à temps. Cet article explique comment utiliser les commandes Linux pour vérifier le nombre de processus telnet, apprenons ensemble. Dans les systèmes Linux, nous pouvons utiliser la commande ps combinée avec la commande grep pour afficher le nombre de processus telnet. Tout d'abord, nous devons ouvrir un terminal,

En langage C, imprimez la vue de droite de l'arbre binaire En langage C, imprimez la vue de droite de l'arbre binaire Sep 16, 2023 pm 11:13 PM

La tâche consiste à imprimer le nœud droit de l'arbre binaire donné. L'utilisateur insérera d'abord des données pour créer un arbre binaire, puis imprimera une vue droite de l'arbre résultant. L'image ci-dessus montre un arbre binaire créé à l'aide des nœuds 10, 42, 93, 14, 35, 96, 57 et 88, avec les nœuds du côté droit de l'arbre sélectionnés et affichés. Par exemple, 10, 93, 57 et 88 sont les nœuds les plus à droite de l'arbre binaire. Exemple d'entrée : 1042931435965788 Sortie : 10935788 Chaque nœud possède deux pointeurs, le pointeur gauche et le pointeur droit. Selon cette question, le programme n'a besoin que de traverser le bon nœud. Par conséquent, l’enfant gauche du nœud n’a pas besoin d’être pris en compte. La vue de droite stocke tous les nœuds qui constituent le dernier nœud de leur hiérarchie. Par conséquent, nous pouvons

Écrivez un code en C++ pour trouver le nombre de sous-tableaux avec les mêmes valeurs minimales et maximales Écrivez un code en C++ pour trouver le nombre de sous-tableaux avec les mêmes valeurs minimales et maximales Aug 25, 2023 pm 11:33 PM

Dans cet article, nous utiliserons C++ pour résoudre le problème de trouver le nombre de sous-tableaux dont les valeurs maximales et minimales sont les mêmes. Voici un exemple du problème −Input:array={2,3,6,6,2,4,4,4}Output:12Explication :{2},{3},{6},{6}, {2 },{4},{4},{4},{6,6},{4,4},{4,4}et{4,4,4}sont les sous-tableaux qui peuvent être formés avec les mêmes éléments maximum et minimum. Entrée : tableau = {3, 3, 1,5,

See all articles