Heap

Ein Heap ist eine spezialisierte Baumdatenstruktur, die die sogenannte Heap-Bedingung erfüllt:
🗼
Wenn P ein Elternknoten von C ist, dann ist der Wert von P größer oder gleich (in einem Max-Heap) bzw. kleiner oder gleich (in einem Min-Heap) als der Wert von C.
Ein Beispiel für einen Max-Heap mit 8 Knoten
Ein Beispiel für einen Max-Heap mit 8 Knoten
Es gibt zwei Haupttypen von Heaps:
  1. Max Heap: Der Wert des Elternknotens ist größer oder gleich dem Wert seiner Kindknoten.
  1. Min Heap: Der Wert des Elternknotens ist kleiner oder gleich dem Wert seiner Kindknoten.
Wir konzentrieren uns auf den Max-Heap, da die meisten Standardbibliotheken für Priority Queues typischerweise einen Max-Heap implementieren. In einem Max-Heap ist das Wurzelelement das größte Element, während die Blätter die kleinsten sind. Es gibt allerdings keine besondere Anordnung bei den Blattknoten. Die einzige Garantie besteht darin, dass der Wert der Wurzel am größten ist und alle Kindknoten kleiner oder gleich diesem Wert sind.
Beachte, dass die letzte Ebene des Heaps immer von links nach rechts aufgefüllt wird. Das heißt, das linke Blatt wird zuerst belegt, und das rechte Blatt zuletzt – wie im oben gezeigten Bild.

Implementation

Ein Heap kann als Array implementiert werden, wobei das erste Element des Arrays den Wurzelknoten darstellt. Da jeder Knoten nur zwei Kindknoten hat, kann man die Indizierung folgendermaßen festlegen:
  1. Das Wurzelelement befindet sich bei Index 1.
  1. Die linken und rechten Kindknoten eines Knotens mit Index i befinden sich bei 2i und 2i+1.
  1. Der Elternknoten eines Elements mit Index i befindet sich bei i // 2.
Der oben abgebildete Heap kann in einer Liste folgendermaßen dargestellt werden:
# Lies einfach jede Zeile aus der Grafik ab und schreibe die Zahlen nebeneinander
heap = [None, 8, 5, 7, 1, 1, 6, 3, 1]

# Oder zur besseren Übersicht
heap = [None,      # Wir überspringen Index [0], um eine einfachere Indizierung zu haben
        8,         # Index   [1]
    5,       7,    # Indizes [2, 3]
  1,  1,   6,  3,  # Indizes [4, 5, 6, 7]
1]                 # Index   [8]
 

Challenge: Check if the binary tree is a heap

Gegeben ist ein binärer Baum, der in einem Array von n Zahlen repräsentiert wird (mit der oben genannten Indizierung). Deine Aufgabe ist es zu prüfen, ob dieser Baum die Max-Heap-Bedingung erfüllt.

Input

Die erste Zeile der Eingabe enthält eine einzelne ganze Zahl n (1 ≤ n ≤ 100 000).
Die nächste Zeile enthält n durch Leerzeichen getrennte Ganzzahlen (), welche die Werte der Elemente im Heap darstellen.

Output

Das Programm soll Yes ausgeben, wenn der binäre Baum die Max-Heap-Bedingung erfüllt, und No, wenn dies nicht der Fall ist.

Examples

Eingabe
Ausgabe
8 8 5 7 1 1 6 3 1
Yes
7 8 5 7 1 9 6 3
No

Explanation

Example 1
All the parent nodes have a value larger than or equal to their child nodes. Therefore, the heap property is satisfied.
All the parent nodes have a value larger than or equal to their child nodes. Therefore, the heap property is satisfied.
 
Example 2
The node with a value of 9 is larger than its parent node. Therefore, the heap property is not satisfied.
The node with a value of 9 is larger than its parent node. Therefore, the heap property is not satisfied.

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue