τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Αυτό το άρθρο θα ξεκινήσει με τις έννοιες που σχετίζονται με τα δέντρα και τα δυαδικά δέντρα για να μας βοηθήσουν να μάθουμε περισσότερα για τα δυαδικά δέντρα.
🌈个人主页:Είναι ο σερβιτόρος
🌈C语言笔记专栏:Γλώσσα Γ σημειώσεις
🌈C++笔记专栏: Σημειώσεις C++
🌈初阶数据结构笔记专栏: Σημειώσεις στοιχειωδών δομών δεδομένων
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
Το δέντρο είναι μια μη γραμμική δομή δεδομένων, η οποία αποτελείται απόn(n>=0)
Οι περιορισμένοι κόμβοι σχηματίζουν ένα σύνολο με ιεραρχική σχέση Ωστόσο, το δέντρο έχει μικρή αξία στην πράξη, αλλά το δυαδικό δέντρο έχει μεγαλύτερη πρακτική αξία (ο λόγος για τον οποίο αυτό το σύνολο ονομάζεται δέντρο είναι ότι έχει τη ρίζα προς τα πάνω και τα φύλλα. στραμμένο προς τα κάτω Μοιάζει πολύ με δέντρο)
M(M>0)
ασύνδετα σύνολαT1、T2、....、Tm
, κάθε σετ των οποίωνTi(1<=i<=m)
Είναι ένα άλλο υποδέντρο με δομή παρόμοια με αυτή ενός δέντρου. Ο ριζικός κόμβος κάθε υποδέντρου έχει έναν και μόνο έναν προκάτοχο και μπορεί να έχει 0 ή περισσότερους διαδόχους.Επειδή η δομή του δέντρου είναι πιο περίπλοκη από τον γραμμικό πίνακα, η μέθοδος αποθήκευσης είναι πιο ενοχλητική. Είναι απαραίτητο να αποθηκεύσετε τόσο το εύρος τιμών όσο και τη σχέση μεταξύ των κόμβων.
Ακολουθούν διάφορες μέθοδοι που βασίζονται σε προηγούμενες γνώσεις:
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
Φυσικά, οι παραπάνω μέθοδοι δεν περιορίζονται και υπάρχουν επίσης εκφράσεις γονέα, εκφράσεις παιδιού, εκφράσεις γονέα παιδιού και εκφράσεις αδερφού παιδιού κ.λπ.Εδώ θα κατανοήσουμε εν συντομία τα πιο συχνά χρησιμοποιούμενααναπαράσταση αδερφού παιδιού
Ένα δυαδικό δέντρο είναι ένα πεπερασμένο σύνολο κόμβων Αυτό το σύνολο μπορεί να έχει δύο καταστάσεις:
Από το σχήμα μπορούν να εξαχθούν δύο συμπεράσματα:
Δεν υπάρχει κόμβος με βαθμό μεγαλύτερο από 2 σε ένα δυαδικό δέντρο
Τα υποδέντρα ενός δυαδικού δέντρου μπορούν να χωριστούν σε αριστερό και δεξιό υποδέντρο και η σειρά δεν μπορεί να αντιστραφεί, επομένως το δυαδικό δέντρο είναι ένα ταξινομημένο δέντρο.
Ειδοποίηση: Για κάθε δυαδικό δέντρο, αποτελείται από τις ακόλουθες καταστάσεις (Το άδειο δέντρο είναι πιο εύκολο να ξεχαστεί)
Για να συνοψίσουμε εν συντομία:
Κάθε επίπεδο ενός πλήρους δυαδικού δέντρου είναι γεμάτο
Εάν το ύψος ενός πλήρους δυαδικού δέντρου είναι n, τότε τα πρώτα n-1 επίπεδα είναι γεμάτα, αλλά το τελευταίο επίπεδο μπορεί να μην είναι πλήρες.Πρέπει όμως να είναι συνεχής από αριστερά προς τα δεξιά
Ένα πλήρες δυαδικό δέντρο είναι μια πολύ αποτελεσματική δομή δεδομένων και ένα πλήρες δυαδικό δέντρο είναι ένας ειδικός τύπος πλήρους δυαδικού δέντρου.
Ένα πλήρες δυαδικό δέντρο είναι απαραίτητη και επαρκής προϋπόθεση για ένα πλήρες δυαδικό δέντρο
Αυτό είναι ένα συνηθισμένο δυαδικό δέντρο, το οποίο δεν είναι συνεχές από αριστερά προς τα δεξιά.
Τα δυαδικά δέντρα μπορούν γενικά να αποθηκευτούν σε δύο δομές, η μία είναι μια διαδοχική δομή και η άλλη είναι μια δομή αλυσίδας.
Η αποθήκευση διαδοχικής δομής είναι η χρήση συστοιχιών για αποθήκευση,Γενικά, οι πίνακες είναι κατάλληλοι μόνο για την αναπαράσταση πλήρων δυαδικών δέντρων. , γιατί αν το δυαδικό δέντρο δεν είναι γεμάτο, θα υπάρξει σπατάλη χώρου Στην πραγματικότητα, μόνο ο σωρός θα χρησιμοποιεί συστοιχίες για αποθήκευση. Η διαδοχική αποθήκευση ενός δυαδικού δέντρου είναι φυσικά ένας πίνακας και λογικά ένα δυαδικό δέντρο Για να λύσουμε την επόμενη ερώτηση, πρέπει να χρησιμοποιήσουμε τον συνδυασμό του φυσικού πίνακα και του λογικού δυαδικού δέντρου για να λύσουμε μια ερώτηση.
leftchild = parent * 2 + 1;
rightchild = paretn * 2 +2;
parent = (child - 1) / 2;
(Δεν κάνει διάκριση μεταξύ αριστερών και δεξιών παιδιών)
Όσον αφορά το τρίτο σημείο, βάσει προσωπικού συλλογισμού,leftchild
Ο δείκτης χωρίζεται σεleftchild- 1
και1
,Γιαleftchild-1
Γιαparent
εγγραφείτε δύο φορές, για(child - 1) / 2
Ο χειριστής θαleftchild
Βγάλτε το ως1
Μερικώς διαιρούμενο με το 2, ο ακέραιος αριθμός είναι 0,leftchild -1
Μέρος του μπορεί να θεωρηθεί ωςleftchild
,καιrightchild与leftchild相差1
,επειδήrightchild = leftchild - 1
και από τα παραπάνωleftchild - 1 ~= leftchild
, μπορεί να συναχθεί ότιrightchild = leftchild(在进行/2运算,取整数情况下)
Η συνδεδεμένη δομή αποθήκευσης ενός δυαδικού δέντρου αναφέρεται στη χρήση μιας συνδεδεμένης λίστας για την αναπαράσταση ενός δυαδικού δέντρου, δηλαδή στη χρήση μιας αλυσίδας για να υποδείξει τη λογική σχέση των στοιχείων. Η συνήθης μέθοδος είναι ότι κάθε κόμβος στη συνδεδεμένη λίστα αποτελείται από τρία πεδία, το πεδίο δεδομένων και τα πεδία αριστερού και δεξιού δείκτη του κόμβου βρίσκονται αντίστοιχα.Οι δομές της αλυσίδας χωρίζονται σε δυαδικές αλυσίδες και σε τριμερείς αλυσίδες Επί του παρόντος, χρησιμοποιούμε γενικά δυαδικές αλυσίδες στις μελέτες μας.
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; // 当前节点值域
};
Η διαδοχική αποθήκευση δομών αποθηκεύεται μέσω πινάκων.Γενικά, οι συστοιχίες είναι κατάλληλες μόνο για πλήρη δυαδικά δέντρα. . Αλλά στην πραγματικότητα, οι συστοιχίες χρησιμοποιούνται για αποθήκευση μόνο όταν χρησιμοποιούνται σωροί και οι περισσότεροι από αυτούς αποθηκεύονται μέσω δομών αλυσίδας.
ο λόγος είναι:
Το παραπάνω είναι όλο το περιεχόμενο αυτού του άρθρου Σας ευχαριστούμε όλους για την ανάγνωση! Εδώ είναι οι σημειώσεις του Dian Xiaoer για τις στοιχειώδεις δομές δεδομένων.