ΜΕΓΑΛΥΤΕΡΗ δυαδική αναζήτηση δέντρο σε ένα δυαδικό δένδρο:
Υπάρχουν δύο τρόποι που μπορούμε να προσεγγίσουμε αυτό το πρόβλημα,
i) Ο μεγαλύτερος BST δεν προκαλείται (Από έναν κόμβο, όλα τα παιδιά της, δεν χρειάζεται να πληρούν την προϋπόθεση BST)
ii) Μεγαλύτερη BST που προκαλείται (Από έναν κόμβο, όλα τα παιδιά της θα πληροί την προϋπόθεση BST)
Θα συζητήσουμε για το μεγαλύτερο BST (που δεν προκαλείται) εδώ. Θα ακολουθήσουμε κάτω προς τα πάνω προσέγγιση (Δημοσίευση διάσχιση σειρά) για την επίλυση αυτού.
α) Reach τον κόμβο φύλλο
β) Ένα κόμβο του δένδρου (από το φύλλο) θα επιστρέψει ένα αντικείμενο TreeNodeHelper η οποία έχει τα ακόλουθα πεδία σε αυτό.
public static class TreeNodeHelper {
TreeNode node;
int nodes;
Integer maxValue;
Integer minValue;
boolean isBST;
public TreeNodeHelper() {}
public TreeNodeHelper(TreeNode node, int nodes, Integer maxValue, Integer minValue, boolean isBST) {
this.node = node;
this.nodes = nodes;
this.maxValue = maxValue;
this.minValue = minValue;
this.isBST = isBST;
}
}
γ) Αρχικά από τον κόμβο φύλλο, κόμβους = 1, isBST = true, MINVALUE = MAXVALUE = node.data. Και επιπλέον, οι κόμβοι μετράνε θα αυξηθεί εάν πληροί την προϋπόθεση BST.
δ) Με τη βοήθεια αυτού, θα ελέγξουμε την κατάσταση BST με τρέχοντα κόμβο. Και θα επαναλάβουμε το ίδιο μέχρι ρίζας.
ε) Από κάθε κόμβο θα επιστραφούν δύο αντικείμενα. ένα για τελευταία μέγιστη BST και ένα άλλο για την τρέχουσα BST ικανοποιητική κόμβους. Έτσι, από κάθε κόμβο (ανωτέρω φύλλο) (2 + 2) = 4 (2 για το αριστερό υποδένδρο και 2 για το δικαίωμα υπο δέντρο) αντικείμενα θα συγκριθούν και δύο θα επιστραφούν.
στ) Η τελική μέγιστη αντικείμενο κόμβο από ρίζα θα είναι η μεγαλύτερη BST
ΠΡΟΒΛΗΜΑ:
Υπάρχει ένα πρόβλημα με αυτήν την προσέγγιση. Αν και μετά από αυτή την προσέγγιση, εάν ένα υποδένδρο δεν πληροί την προϋπόθεση BST με τον τρέχοντα κόμβο, δεν μπορούμε απλά να αγνοήσουμε το υποδένδρο (ακόμα και να έχει μικρότερο αριθμό κόμβων). Για παράδειγμα
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
Από τους κόμβους φύλλων (20110) τα αντικείμενα θα δοκιμαστούν με τον κόμβο (105), αυτό ικανοποιεί τη συνθήκη. Αλλά όταν φτάσει κόμβου (95) ο κόμβος φύλλο (20) δεν πληροί την προϋπόθεση BST. Δεδομένου ότι αυτή η λύση είναι για BST (δεν προκαλείται) δεν πρέπει να αγνοούμε κόμβο (105) και τον κόμβο (110), η οποία ικανοποιεί τη συνθήκη. Έτσι, από τον κόμβο (95) θα πρέπει να κάνουν πίσω και πάλι τον έλεγχο κατάστασης BST και να πιάσει αυτούς τους κόμβους (105, 110).
Η πλήρης κωδικός για την εφαρμογή αυτή είναι διαθέσιμη σε αυτό το σύνδεσμο
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0