Le nombre de triangles isocèles dans un arbre binaire
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]
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; }
Sortie
Number of isosceles triangles in the binary tree are 8
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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

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.

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

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

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

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,

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

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,
