2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Structures de données élémentaires | Points de connaissances associés | Vous pouvez cliquer | Apprenez à partir des liens ci-dessous | travaillez dur ensemble ! |
---|---|---|---|---|
Une analyse approfondie de la complexité temporelle et spatiale | Analyse approfondie des tables de séquences : explorer la logique sous-jacente | Analyse approfondie des listes chaînées : explorer la logique sous-jacente | Analyse approfondie de la principale liste chaînée circulaire bidirectionnelle : explorer la logique sous-jacente | Une plongée approfondie dans la pile : explorer la logique sous-jacente |
Analyse approfondie des files d'attente : explorer la logique sous-jacente | Analyse approfondie des files d'attente circulaires : explorer la logique sous-jacente |
Cet article commencera par les concepts liés aux arbres et aux arbres binaires pour nous aider à en apprendre davantage sur les arbres binaires.
🌈个人主页:C'est le serveur
🌈C语言笔记专栏:Notes en langage C
🌈C++笔记专栏: Remarques C++
🌈初阶数据结构笔记专栏: Notes sur la structure des données élémentaires
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
L'arbre est une structure de données non linéaire, composée den(n>=0)
Les nœuds limités forment un ensemble avec une relation hiérarchique. Cependant, l'arbre a peu de valeur en pratique, mais l'arbre binaire a une plus grande valeur pratique (la raison pour laquelle cet ensemble est appelé arbre est qu'il a la racine tournée vers le haut et les feuilles). face vers le bas. Cela ressemble beaucoup à un arbre)
M(M>0)
ensembles disjointsT1、T2、....、Tm
, dont chaque ensembleTi(1<=i<=m)
C'est un autre sous-arbre avec une structure similaire à celle d'un arbre. Le nœud racine de chaque sous-arbre a un et un seul prédécesseur et peut avoir 0 ou plusieurs successeurs.La structure arborescente étant plus complexe que le tableau linéaire, la méthode de stockage est plus lourde. Il est nécessaire de sauvegarder à la fois la plage de valeurs et la relation entre les nœuds.
Voici plusieurs méthodes basées sur des connaissances antérieures :
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
Bien sûr, les méthodes ci-dessus ne sont pas limitées, et il existe également des expressions parent, des expressions enfant, des expressions parent enfant et des expressions frère enfant, etc.Ici, nous comprendrons brièvement les plus couramment utilisésreprésentation du frère enfant
Un arbre binaire est un ensemble fini de nœuds. Cet ensemble peut avoir deux situations :
Deux conclusions peuvent être tirées de la figure:
Il n'y a aucun nœud de degré supérieur à 2 dans un arbre binaire
Les sous-arbres d'un arbre binaire peuvent être divisés en sous-arbres gauche et droit, et l'ordre ne peut pas être inversé, donc l'arbre binaire est un arbre ordonné.
Avis: Pour tout arbre binaire, il est composé des situations suivantes (La situation de l'arbre vide est la plus facile à oublier)
Pour résumer brièvement:
Chaque niveau d'un arbre binaire complet est plein
Si la hauteur d'un arbre binaire complet est n, alors les n-1 premiers niveaux sont pleins, mais le dernier niveau peut ne pas être plein.Mais il faut que ce soit continu de gauche à droite
Un arbre binaire complet est une structure de données très efficace, et un arbre binaire complet est un type particulier d'arbre binaire complet.
Un arbre binaire complet est une condition nécessaire et suffisante pour un arbre binaire complet
Il s’agit d’un arbre binaire ordinaire, qui n’est pas continu de gauche à droite.
Les arbres binaires peuvent généralement être stockés dans deux structures, l’une est une structure séquentielle et l’autre est une structure en chaîne.
Le stockage de structure séquentielle consiste à utiliser des tableaux pour stocker,Généralement, les tableaux ne conviennent que pour représenter des arbres binaires complets. , car si l'arborescence binaire n'est pas pleine, il y aura une perte d'espace. En réalité, seul le tas utilisera des tableaux pour le stockage. Le stockage séquentiel des arbres binaires est physiquement un tableau et logiquement un arbre binaire. Pour résoudre la question suivante, nous devons utiliser la combinaison physique d'un tableau et logiquement d'un arbre binaire pour résoudre une question.
leftchild = parent * 2 + 1;
rightchild = paretn * 2 +2;
parent = (child - 1) / 2;
(Ne fait pas de différence entre les enfants de gauche et de droite)
Concernant le troisième point, basé sur un raisonnement personnel,leftchild
L'indice est divisé enleftchild- 1
et1
,pourleftchild-1
pourparent
indice deux fois, pour(child - 1) / 2
L'opérateur valeftchild
Retirez-le comme1
Partiellement divisé par 2, l'entier est 0,leftchild -1
Une partie peut être considérée commeleftchild
,etrightchild与leftchild相差1
,parce querightchild = leftchild - 1
et par dessusleftchild - 1 ~= leftchild
, on peut en déduire querightchild = leftchild(在进行/2运算,取整数情况下)
La structure de stockage liée d'un arbre binaire signifie qu'une liste chaînée est utilisée pour représenter un arbre binaire, c'est-à-dire qu'une chaîne est utilisée pour indiquer la relation logique des éléments. La méthode habituelle est que chaque nœud de la liste chaînée se compose de trois champs, le champ de données et les champs de pointeur gauche et droit. Les pointeurs gauche et droit sont utilisés pour donner les adresses de stockage des points de liaison où se trouvent l'enfant gauche et l'enfant droit. du nœud sont situés respectivement.Les structures de chaîne sont divisées en chaînes binaires et chaînes trifurquées.À l'heure actuelle, nous utilisons généralement des chaînes binaires dans nos études. Plus tard, lorsque nous apprendrons les structures de données d'ordre élevé telles que les arbres rouge-noir, les chaînes trifurquées seront utilisées.
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
};
Le stockage de structure séquentielle est stocké via des tableaux.Généralement, les tableaux ne conviennent qu'aux arbres binaires complets. Les arbres binaires non complets ne conviennent pas au stockage de structure de tableau. Les arbres binaires ordinaires ne conviennent qu'au stockage de structure de chaîne. . Mais en réalité, les tableaux ne sont utilisés pour le stockage que lorsque des tas sont utilisés, et la plupart d'entre eux sont stockés via des structures en chaîne.
la raison est:
Ce qui précède représente tout le contenu de cet article. Merci à tous d’avoir lu ! Voici les notes de Dian Xiaoer sur les structures de données élémentaires. J'espère qu'elles vous seront utiles dans l'apprentissage des structures de données élémentaires !