Περιστροφές δένδρων BST (Δομές Δεδομένων)
Posted: Wed Jan 24, 2007 3:02 am
Παιδιά έχω ένα πρόβλημα! Στις σημειώσεις για τις Δομές δεδομένων(βασισμένες στου Princeton) περιγράφονται οι συναρτήσεις για περιστροφή Binary-Search-Trees... Όμως απ'ότι φαίνεται αυτές οι δύο μέθοδοι ούτε καν περιστρέφουν το δέντρο με το γνωστό αλγόριθμο. Συγκεκριμένα όταν γίνεται π.χ RotR για κάποια ρίζα υπόδενδρου μπλέκει και τον πατέρα του και τον παππού του, κάτι που αυτές οι μέθοδοι δεν κάνουν... Απ' ότι κατάλαβα οι μέθοδοι χρησιμοποιούνται από τον Sedgewick αναδρομικά για να κάνουμε εισαγωγή στοιχείου στη ρίζα και ΜΟΝΟ....
Ο σωστός κώδικας που βρήκα είναι κάτι σαν αυτό:
Επίσης ο τελευταίος κώδικας μας προστατεύει να μην περιστρέψουμε κάποιο κόμβο δένδρου που δεν επιτρέπεται....
Να και ένα ωραίο link που βρίκα για τις περιστροφές με applet
http://www.cs.queensu.ca/~jstewart/appl ... ation.html
Εσείς τι γνώμη έχετε ? thx
Code: Select all
class bst<Item extends Comparable> {
private class Node{
Node left;
Node right;
Item item;
private Node(Item item) {
this.item=item;
}
}
Node root;
public void insert(Item item) {
root=insert(root,item);
}
public void insert(Item[] items) {
for (int i=0; i<items.length; i++)
insert(items[i]);
}
private Node insert(Node x,Item item) {
if (x==null)
return new Node(item);
else if(item.compareTo(x.item)<0)
x.left = insert(x.left,item);
else
x.right = insert(x.right,item);
return x;
}
public Node protL(Node h) { //aristeri peristrofi
Node x=h.right;
h.right=x.left;
x.left=h;
return x;
}
public Node protR(Node h) { //dexia peristrofi
Node x=h.left;
h.left=x.right;
x.right=h;
return x;
}
public static void main(String args[]) {
bst<Character> searchtree=new bst<Character>();
Character[] chars={'A','S','E','R','C','H','I','N','G','X','M','P','L'};
searchtree.insert(chars);
//dokimes
System.out.println(searchtree.root.item);
System.out.println(searchtree.root.right.item);
System.out.println(searchtree.root.right.left.item);
System.out.println(searchtree.root.right.left.right.item);
searchtree.rotR(searchtree.root.right);
System.out.println("After Right Rotation");
System.out.println(searchtree.root.item);
System.out.println(searchtree.root.right.item);
System.out.println(searchtree.root.right.left.item);
System.out.println(searchtree.root.right.left.left.item);
}
}
Ο σωστός κώδικας που βρήκα είναι κάτι σαν αυτό:
Code: Select all
void rotate( node c ) {
node p = c.parent; // parent of c
node gp = p.parent; // grandparent of c (might be null)
// Update the lower edge which switches sides
if (c == p.left) {
p.left = c.right;
if (p.left != null)
p.left.parent = p;
c.right = p;
p.parent = c;
} else {
p.right = c.left;
if (p.right != null)
p.right.parent = p;
c.left = p;
p.parent = c;
}
// Update the upper edge which switches sides
if (gp == null)
root = c;
else if (p == gp.left)
gp.left = c;
else
gp.right = c;
c.parent = gp;
}
}
Να και ένα ωραίο link που βρίκα για τις περιστροφές με applet
http://www.cs.queensu.ca/~jstewart/appl ... ation.html
Εσείς τι γνώμη έχετε ? thx
