Eine kurze Diskussion über Datenstrukturen – Einführung in Bäume

Für weitere Details suchen Sie bitte auf WeChat nach „ 前端爱好者 und klicken Sie auf „Ich“, um es anzuzeigen .

Datenstruktur

Die Datenstruktur ist eines der grundlegenden Konzepte der Informatik und umfasst die Art und Weise, wie Daten organisiert und gespeichert werden, damit auf sie effizient zugegriffen, sie verwaltet und manipuliert werden können. Eine Datenstruktur ist eine Möglichkeit zur Beschreibung oder Darstellung von Daten. Sie definiert die Art und Weise, wie Daten gespeichert werden, Beziehungen und Methoden zur Datenbearbeitung.

Hier sind einige gängige Datenstrukturtypen:

  1. Baum : Dies ist eine nichtlineare Datenstruktur, die zur Darstellung von Daten mit hierarchischen Beziehungen verwendet wird. Ein häufiges Beispiel für einen Baum ist ein Binärbaum, bei dem jeder Knoten höchstens zwei untergeordnete Knoten hat.
  2. Diagramm : Dies ist eine nichtlineare Datenstruktur, die zur Darstellung einer beliebigen Anzahl von Knoten und der Verbindungen zwischen ihnen verwendet wird. Graphen können ungerichtet oder gerichtet sein, Zyklen enthalten und selbstverbunden sein.
  3. Heap : Dies ist eine Datenstruktur, die zum Speichern eindeutiger Elemente verwendet wird. Die Hauptoperationen von Sammlungen sind das Hinzufügen von Elementen (add) und das Entfernen von Elementen (remove).
  4. Hash-Tabelle/Hash-Tabelle (Hash) : Dies ist eine Datenstruktur, die zur Implementierung schneller Suchvorgänge verwendet wird. Hash-Tabellen ordnen Schlüssel über eine Hash-Funktion Buckets zu, suchen sie dann nach und speichern sie in den Buckets.
  5. Stapel : Dies ist eine Last-In-First-Out-Datenstruktur (LIFO), die nur an einem Ende eingefügt und gelöscht werden kann. Die Hauptoperationen des Stapels sind Push (Elemente hinzufügen) und Pop (Elemente entfernen).
  6. Warteschlange : Dies ist eine FIFO-Datenstruktur (First-In-First-Out), die Elemente an einem Ende hinzufügen und Elemente am anderen Ende löschen kann. Die Hauptoperationen der Warteschlange sind Enqueue (Hinzufügen von Elementen) und
  7. Array : Dies ist eine lineare Datenstruktur, die als eine Reihe von Elementen desselben Typs betrachtet werden kann. Arrays sind im Speicher zusammenhängend und auf Elemente an jeder Position kann per Index zugegriffen werden.
  8. Likend-Liste : Dies ist eine lineare Datenstruktur, die aus einer Reihe von Knoten besteht. Jeder Knoten enthält einen Wert und einen Zeiger auf den nächsten Knoten. Eine verknüpfte Liste erfordert nicht, dass alle Elemente im Speicher zusammenhängend sind.

Diese gängigen Datenstrukturen haben jeweils ihre eigenen Vor- und Nachteile, und die geeignete Datenstruktur sollte entsprechend dem jeweiligen Anwendungsszenario ausgewählt werden.

Für die Speicherung und den Zugriff auf eine große Anzahl von Elementen können beispielsweise Arrays und Hash-Tabellen die bessere Wahl sein; für Daten, bei denen das Einfügen und Löschen von Elementen effizient erfolgen muss, sind verknüpfte Listen und dynamische Arrays möglicherweise die bessere Wahl; für Daten, die muss Elementsuchvorgänge beibehalten. Für eine effiziente Datenmanipulation sind Suchbäume möglicherweise die bessere Wahl.

Darüber hinaus sind Datenstrukturen und Algorithmen oft eng miteinander verbunden.

Das Verstehen und Beherrschen verschiedener Datenstrukturen und ihrer Betriebsmethoden kann uns dabei helfen, Algorithmen effektiver zu entwerfen und zu implementieren und die Programmleistung zu optimieren.

Baum

Baumdefinition

树是n(n>=0)个结点的有限集。当n = 0时,称为空树

In jedem nicht leeren Baum sollte Folgendes erfüllt sein:

  • Es gibt nur einen bestimmten Knoten namens Root.
  • Wenn n>1 ist, können die verbleibenden Knoten in m (m>0) disjunkte endliche Mengen T1, T2, ..., Tm unterteilt werden, wobei jede Menge selbst ein Baum ist und als Teilbaum der Wurzel bezeichnet wird.

Offensichtlich ist die Definition von Baum rekursiv, das heißt, sie wird selbst in der Definition von Baum verwendet. Baum ist eine rekursive Datenstruktur.

Als logische Struktur und hierarchische Struktur weist ein Baum die folgenden zwei Merkmale auf:

  • Der Wurzelknoten des Baums hat keinen Vorgänger, und alle Knoten außer dem Wurzelknoten haben genau einen Vorgänger.
  • Alle Knoten im Baum können null oder mehr Nachfolger haben.

Daher gibt es n-1 Kanten in einem Baum mit n Knoten.

Grundbegriffe

Im Folgenden erklären wir anhand von Abbildungen einige grundlegende Begriffe und Konzepte von Bäumen.

结点、祖先、子孙、双亲、兄弟

Betrachten Sie Knoten K. Jeder Knoten auf dem eindeutigen Pfad von Wurzel A zu Knoten K wird als Vorfahr von Knoten K bezeichnet. Beispielsweise ist Knoten B der Vorfahre von Knoten K und Knoten K der Nachkomme von Knoten B. Der Knoten E, der dem Knoten K auf dem Pfad am nächsten liegt, wird als übergeordneter Knoten von K bezeichnet, und K ist der untergeordnete Knoten von Knoten E. Wurzel A ist der einzige Knoten im Baum, der keine übergeordneten Knoten hat. Knoten mit denselben Eltern werden als Brüder bezeichnet . Beispielsweise haben Knoten K und Knoten L denselben Elternteil E, dh K und L sind Brüder.

Knotengrad, Baumgrad

Die Anzahl der Kinder eines Knotens in einem Baum wird als Grad des Knotens bezeichnet , und der maximale Grad eines Knotens im Baum wird als Grad des Baums bezeichnet .

Beispielsweise ist der Grad des Knotens B 2, der Grad des Knotens D ist 3 und der Grad des Baums ist 3.

Zweigknoten/Nicht-Endknoten, Blattknoten/Endknoten
  • Knoten mit einem Grad größer als 0 werden als Verzweigungsknoten (auch Nichtterminalknoten genannt ) bezeichnet.
  • Ein Knoten mit Grad 0 (keine untergeordneten Knoten) wird als Blattknoten (auch Endknoten genannt ) bezeichnet.

Bei Verzweigungsknoten ist die Anzahl der Verzweigungen jedes Knotens der Grad des Knotens.

Knotentiefe, -höhe und -ebene
  • Die Hierarchie der Knoten wird ausgehend von der Wurzel des Baums definiert. Der Wurzelknoten ist Ebene 1, seine untergeordneten Knoten sind Ebene 2 und so weiter. Knoten, deren Eltern auf derselben Ebene liegen, sind Cousins . In der Abbildung sind die Knoten G und E, F, H, I und J Cousins.
  • Die Tiefe eines Knotens wird Schicht für Schicht akkumuliert, beginnend beim Wurzelknoten und von oben nach unten.
  • Die Höhe des Knotens wird Schicht für Schicht akkumuliert, beginnend beim Blattknoten und von unten nach oben.
  • Die Höhe (oder Tiefe) eines Baums ist die maximale Anzahl der Knotenebenen im Baum. Die Höhe des Baumes auf dem Bild beträgt 4.
Geordnete Bäume und ungeordnete Bäume.
  • Jeder Teilbaum eines Knotens im Baum von links nach rechts ist 有次序,不能互换 der Baum heißt 有序树, andernfalls heißt er 无序树.

Angenommen, das Bild ist ein geordneter Baum. Wenn die Positionen der Unterknoten vertauscht werden, wird es zu einem Baum 不同的树.

Pfad und Pfadlänge.

Der Pfad zwischen zwei Knoten im Baum besteht aus der Folge von Knoten, die zwischen den beiden Knoten durchlaufen werden, und die Pfadlänge ist die Anzahl der auf dem Pfad durchlaufenen Kanten.

Hinweis: Da die Zweige im Baum gerichtet sind, also von den Eltern zu den Kindern, verläuft der Pfad im Baum von oben nach unten und es gibt keinen Pfad zwischen zwei Kindern desselben Elternteils .

Wald.

Der Wald 互不相交besteht aus集合 m (m≥0) Bäumen .

Das Konzept des Waldes ist dem Konzept des Baumes sehr ähnlich, denn solange der Wurzelknoten des Baumes gelöscht wird, wird er zu einem Wald.

Im Gegenteil, solange ein Knoten zu m unabhängigen Bäumen hinzugefügt wird und diese m Bäume als Unterbäume des Knotens verwendet werden, wird der Wald zu einem Baum.

Baum Natur

Bäume haben die folgenden grundlegendsten Eigenschaften:

Baumspeicherstruktur

Bei der Einführung der folgenden drei Speicherstrukturen nehmen wir den folgenden Baum als Beispiel.

Elternvertretung

Wir gehen davon aus, dass die Knoten des Baums in einer Reihe kontinuierlicher Räume gespeichert sind und an jedem Knoten ein Indikator angebracht ist, der die Position des Knotens in der verknüpften Liste anzeigt双亲 . Mit anderen Worten: Jeder Knoten weiß nicht nur, wer er ist, sondern auch, wo sich seine übergeordneten Knoten befinden.

Unter diesen sind Daten das Datenfeld, in dem die Dateninformationen des Knotens gespeichert werden. Und parent ist ein Zeigerfeld, das die Indizes der Eltern des Knotens im Array speichert.

Das Folgende ist der Knotenstruktur-Definitionscode für unsere übergeordnete Darstellung.

/*树的双亲表示法结点结构定义*/
#define MAX_TREE_SIZE 100
typedef int TElemType;	//树结点的数据类型,目前暂定为整型

/*结点结构*/
typedef struct PTNode{
    
    
	TElemType data;	//结点数据
	int parent;	//双亲位置
}PTNode;

/*树结构*/
typedef struct{
    
    
	PTNode nodes[MAX_TREE_SIZE];	//结点数组
	int r, n;	//根的位置和结点数
}PTree;

Mit einer solchen Speicherstruktur können wir seinen übergeordneten Knoten leicht anhand des übergeordneten Zeigers des Knotens finden. Die verwendete Zeitkomplexität beträgt 0(1). Wenn der übergeordnete Knoten -1 ist, bedeutet dies, dass die Wurzel des Baumknotens gefunden wurde.

Aber wenn wir wissen wollen, was die Kinder des Knotens sind, tut mir leid, bitte 遍历整个结构.

Kindervertretung

Die spezifische Methode lautet: Ordnen Sie die untergeordneten Knoten jedes Knotens an und verwenden Sie eine einfach verknüpfte Liste als Speicherstruktur. Dann haben n Knoten n untergeordnete verknüpfte Listen. Wenn es sich um einen Blattknoten handelt, ist die einfach verknüpfte Liste leer. Dann bilden die n Kopfzeiger eine lineare Tabelle, die eine sequentielle Speicherstruktur verwendet und in einem eindimensionalen Array gespeichert wird , wie in der Abbildung gezeigt.

Zu diesem Zweck werden zwei Knotenstrukturen entworfen:

Einer ist der untergeordnete Knoten der untergeordneten verknüpften Liste.

In:

child是数据域,用来存储某个结点在表头数组中的下标。
next 是指针域,用来存储指向某结点的下一个孩子结点的指针。

Der andere ist der Header-Knoten des Header-Arrays.

In:

data是数据域,存储某结点的数据信息。
firstchild 是头指针域,存储该结点的孩子链表的头指针。

Unten finden Sie den Strukturdefinitionscode für unsere untergeordnete Darstellung.

/*树的孩子表示法结构定义*/
#define MAX_TREE_SIZE 100

/*孩子结点*/
typedef struct CTNode{
    
    
	int child;
	struct CTNode *next;
}*ChildPtr;

/*表头结点*/
typedef struct{
    
    
	TElemType data;
	ChildPtr firstchild;
}CTBox;

/*树结构*/
typedef struct{
    
    
	CTBox nodes[MAX_TREE_SIZE];	//结点数组
	int r, n;	//根的位置和结点数
}

Wenn wir mit einer solchen Struktur ein untergeordnetes Element eines Knotens oder die Brüder eines Knotens finden möchten, müssen wir nur die einfach verknüpfte Liste der untergeordneten Elemente dieses Knotens finden. Es ist auch sehr praktisch, den gesamten Baum zu durchlaufen, indem Sie einfach das Array des Kopfknotens durchlaufen.

Es gibt jedoch auch Probleme. Wie kann man herausfinden, wer die Eltern eines bestimmten Knotens sind? Das ist problematischer. Es erfordert das Durchlaufen des gesamten Baums. Ist es nicht möglich, die übergeordnete Darstellung und die untergeordnete Darstellung zu kombinieren? Natürlich ist dies der Fall möglich. , Leser können versuchen, es selbst zu kombinieren und werden hier nicht auf Details eingehen.

Vertretung des Kindesbruders

Gerade haben wir die Speicherstruktur des Baums aus der Perspektive der Eltern und der Perspektive der Kinder untersucht. Was wäre, wenn wir die Perspektive der Brüder der Baumknoten betrachten würden?

Natürlich ist es für eine hierarchische Struktur wie einen Baum nicht möglich, nur die Brüder der Knoten zu untersuchen. Nach der Beobachtung haben wir festgestellt, dass für jeden Baum seine Knoten 第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的. Daher setzen wir zwei Zeiger, die auf das erste Kind des Knotens und das rechte Geschwister des Knotens zeigen.

Der Aufbau des Knotens ist wie folgt:

In:

  • Daten sind das Datenfeld,
  • firstchild ist ein Zeigerfeld, das die Speicheradresse des ersten untergeordneten Knotens des Knotens speichert.
  • Rightsib ist ein Zeigerfeld, das die Speicheradresse des rechten Geschwisterknotens des Knotens speichert.

Diese Darstellung erleichtert das Auffinden eines untergeordneten Knotens.

Der Strukturdefinitionscode lautet wie folgt.

/*树的孩子兄弟表示法结构定义*/
typedef struct CSNode{
    
    
	TElemtype data;
	struct CSNode *firstchild, *rightsib;
} CSNode, *CSTree;

Durch diese Struktur haben wir den ursprünglichen Baum in etwa wie folgt umgewandelt:

Ist das nicht nur ein Binärbaum?

Ja, tatsächlich besteht der größte Vorteil dieser Darstellung darin, dass sie einen komplexen Baum in einen Binärbaum umwandelt.

Referenzdokumentation

  • https://blog.csdn.net/Bb15070047748/article/details/119208588
  • https://blog.csdn.net/Real_Fool_/article/details/113930623

Supongo que te gusta

Origin blog.csdn.net/BradenHan/article/details/135258400
Recomendado
Clasificación