Δυαδικά ΔΕΝΔΡΑ Αναζήτησης
Ρίζα (κόμβος που δεν έχει γονέα)
πρόγονοι
απόγονοι
γονέας
∆έντρο είναι µία συλλογή από
στοιχεία, που ονοµάζονται κόµβοι
και συνδέονται µεταξύ τους µε τη
βοήθεια ακµών
παιδιά
αδέλφια κόμβοι με κοινό πατέρα
Φύλλα (κόμβοι χωρίς παιδιά)
Δυαδικό δένδρο
Κάθε κόμβος έχει το πολύ 2 παιδιά,
Το αριστερό και το δεξί.
Μπορεί να έχει και ένα μόνο παιδί.
(Σε ένα γνήσιο δυαδικό δένδρο, κάθε κόμβος έχει ή 0 ή 2 παιδιά)
VK 46
Αριθμητικές Παραστάσεις σε δυαδικό δένδρο
VK 47
Trees (Traversing)
∆ΙΑΠΕΡΑΣΗ ∆ΕΝ∆ΡΟΥ
Συστηµατικός τρόπος επίσκεψης όλων των
κόµβων του δένδρου.
Υπάρχουν 4 τρόποι διαπέρασης:
•
•
•
•
ενδοδιατεταγμένη - InOrder
1, 3, 5, 6, 8, 9,
προδιατεταγµένη - PreOrder
5, 1, 3, 8, 6, 9,
µεταδιατεταγµένη - PostOrder
3, 1, 6, 9, 8, 5,
διάταξη κατά επίπεδα
∆υαδικά ∆ένδρα Αναζήτησης
•Κάθε κόµβος είναι µεγαλύτερος των κόµβων του αριστερού του κλάδου και
µικρότερος των κόµβων του δεξιού του κλάδου (6<8<9)
•Όταν διαπεραστούν (traversing) µε ενδοδιάταξη (αριστερό, πατέρας, δεξί)
–ορίζεται µόνο στα δυαδικά δένδρα εµφανίζονται τα στοιχεία ταξινοµηµένα.
VK 48
Αναπαράσταση Δυαδικού Δένδρου με την βοήθεια διπλά συνδεδεμένης λίστας
public class BSTree {
private TreeNode root;
public BSTree() {root=null;}
}
•Υλοποίηση Κόμβου
public boolean isLeaf()
public class TreeNode
private TreeNode left;
private int item;
private TreeNode right;
{
public TreeNode (TreeNode l, int i,TreeNode r)
{left=l; item=i; right=r; }
public TreeNode() {this(nulll,null,null);
}
//μέθοδοι get/set
}
VK 49
Trees (adding)
insert (5,root)
insert(1,root)
insert(8,root)
tree.add (5)
tree.add (1)
tree.add (8)
αν το 3 είναι µικρότερο από το «5»
αν αριστερά του «5» δεν υπάρχει κάτι
βάλτο αριστερά του
αλλιώς
insert (3, στον αριστερό του «5»)
void insert (item,node)
tree.add (6) Αν (item < node.item)
Αν (node.left==null)
tree.add (3)
node.left=new node(item)
tree.add (9)
αλλιώς
insert( item, node.left)
insert(3,root)
(3 < 5)
(root.left == null)
insert (3,node1)
insert(3,node1)
(3 > 1)
(root.right = = null)
node1.left =new
node(3)
Αλλιως
αν (item > node.item)
(node.right==null)
node.right=new node(item)
else
insert( item ,node.right)
αν το 3 είναι µεγαλύτερο από το «1»
αν δεξιά του «1» δεν υπάρχει κάτι
βάλτο δεξιά του
αλλιώς
insert (3, στον δεξιά του «1»)
VK 50
Trees – Removing (a. -leaf)
tree.remove (9)
delete(9,root)
Aν βγει φύλλο, που
∆ΕΝ ΕΧΕΙ ΠΑΙ∆ΙΑ
TreeNode delete(item,node)
if (node == null) return node
if (item==node.item) //είναι στον κόµβο
if (node .isLeaf) return null
else
{ ……}
//επόµενη διαφάνεια
delete (9,root)
(root==null)
(9 == 5)
(9 > 5)
root.setRight
( delete(9,node8))
return root
else
//δεν είναι στο κόµβο
{
if (item < node.item) //ψάξε left
delete (9,node8) delete (9,node9) node.setLeft (delete(item, node.left)
return node
(node8==null)
(node9.isLeaf)
else
(9==8)
return null
if (item > node.item) //ψάξε right
(9 > 8)
node.setRight(delete(item,
node8.setRight
node.right)
( delete (9,node9) )
return node
return node8
}
VK 51
Trees – Removing (b. –internal - right null)
tree.remove (8)
=>delete(8,root)
delete (8,root)
(root==null)
(8 == 5)
(8 > 5)
root.setRight
( delete(8,node8))
return root
delete (8,node8)
(node8==null)
(8==8)
(node8.IsLeaf)
(node8.right==null)
node8.setItem(6)
node8.setLeft(null)
node8.setRight(null)
return node8
TreeNode delete(item,node)
if (node == null) return node
if(item==node.item) //είναι στον κόµβο
{
(node.isLeaf) return null
else {
if (node.right==null)
node.setItem(node.left(item))
node.setLeft((node.left).left)
node.setRight((node.left).right)
else { ….. } //επόµενη διαφάνεια
return node }
}
else //δεν είναι στο κόµβο
{
if(item < node.item) //L
node.setLeft (delete(item, node.left)
return node
else
if (item > node.item) //R
node.setRight(delete(item, node.right)
return node
VK 52
}
Trees – Removing (c. –internal –right not null)
tree.remove (1)
=>delete(1,root)
2
delete (1,node1)
(node1==null)
(1==1)
delete (1,root)
(node1.IsLeaf)
(root==null)
(node1.right==null)
(1 == 5)
node1.setItem(3)
(1 < 5)
(node1.left==null)
root.setLeft
node1.setleft(3.left)
( delete(1,node1))
node1.setright(3.right)
return root
return node1
TreeNode delete(item,node)
if (node == null) return node
if (item==node.item) //είναι στον κόµβο
{
if (node.isLeaf) return null
else {
if (node.right==null)
….
else { //leaf with left null
node.setItem(node.left(item))
if (node.left==null)
node.setLeft((node.right).left)
else
{ Rnode=node.left
while (Rnode.right!=null)
{Rnode=Rnode.right}
Rnode.setRight
((node.Right).left)
}
node.setright((node.right).right)}
return node }
}
else //δεν είναι στο κόµβο
{….
}
VK 53
© Copyright 2026 Paperzz