Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Chapter 3.3
Recursive Data Structures
Part 2 :
Binary Trees
Info 3.3.
Common Recursive
Data Structures
Linear Lists
Binary Trees
Info 3.3.
2
A Recursive Data Structure
Example : A Pedigree
Myself
Name
Father Mother
Myfather
Mygrandfather
Mygrandmother
Mymother
Mygrandfather
Mygrandmother
Info 3.3.
3
Recursive Data Structures
Implementation by variant pointers
TYPE
Link
=
POINTER TO Person;
Father Mother
Person =
RECORD
Name
: String;
Name
Name
Father,
Mother : Link
Father Mother Father Mother
END
Name
Name
Name
Name
Father Mother
Father Mother
Father Mother
Info 3.3.
4
Binary Trees
Definitions
ROOT
Right
subtree
Left
subtree
Leaves
Ordered binary tree : when keys of
- all elements of left subtree smaller than Root
- all elements of right subtree larger dan Root.
Info 3.3.
5
Ordered Binary Trees
Definitions
Ordered binary tree : when
all elements of left subtree smaller than Root
all elements of right subtree larger than Root.
left
when
binary
all
larger
than
Search time < tLog2n
Info 3.3.
6
Ordered Binary Trees
Data Declarations for Dictionary
TYPE
Link = POINTER TO Node;
Node = RECORD
Key : String;
(* other data fields *)
Left, Right : Link
END;
Info 3.3.
7
Ordered Binary Trees
Dictionary Building
PROCEDURE Build(VAR p:Link;x:String);
BEGIN
IF p = NIL
THEN
NEW(p); p^.Key:= x;
p^.Left:= NIL; p^.Right := NIL
ELSE
CASE Compare(x,p^.Key) OF
less
: Build(p^.Left,x)
|
equal :
|
greater: Build(p^.Right,x)
END (* CASE *)
END; (* IF *)
END Build;
Info 3.3.
8
Ordered Binary Trees
Node Deletion
3
2
1
6
7
4
3 different situations :
a) not present :
8
b) 0 or 1 successor :
1, 2, 4, 5, 7
c) 2 successors :
3, 6
5
Info 3.3.
9
Ordered Binary Trees
Deletion of node 2
3
3
2
1
6
6
7
4
5
1
7
4
5
Info 3.3. 10
Ordered Binary Trees
Deletion of node 3
Root := Rightmost of left subtree
3
2
1
6
2
7
4
5
1
6
7
4
5
Info 3.3. 11
Ordered Binary Trees
Deletion of node 3
Root := Leftmost of right subtree
3
2
1
2
6
7
4
5
1
6
7
4
5
Info 3.3. 12
Ordered Binary Trees
Node Deletion Procedure (1)
PROCEDURE Delete(VAR p:Link;x:String);
VAR q : Link;
PROCEDURE RightMost(VAR r:Link);
...
END RightMost;
BEGIN
IF p # NIL THEN
CASE Compare(x,p^.Key) OF
less
: Delete(p^.Left,x) |
equal : Remove p^
|
greater: Delete(p^.Right,x)
END (* CASE *)
END; (* IF *)
END Delete;
Info 3.3. 13
Ordered Binary Trees
Node Deletion Procedure (2)
(* Remove p^ *)
q := p;
IF
q^.Right = NIL THEN
p:= q^.Left
ELSIF q^.Left = NIL THEN
p:= q^.Right
ELSE RightMost(p^.Left)
END; (* IF *)
DISPOSE(q)
Info 3.3. 14
Ordered Binary Trees
Node Deletion Procedure (3)
p
q
(* Remove p^ *)
q := p;
IF
q^.Right = NIL THEN
p:= q^.Left
ELSIF q^.Left = NIL THEN
p:= q^.Right
ELSE RightMost(p^.Left)
END; (* IF *)
DISPOSE(q)
can be NIL
Info 3.3. 15
Ordered Binary Trees
Node Deletion Procedure (4)
p
q
(* Remove p^ *)
q := p;
IF
q^.Right = NIL THEN
p:= q^.Left
ELSIF q^.Left = NIL THEN
p:= q^.Right
ELSE RightMost(p^.Left)
END; (* IF *)
DISPOSE(q)
Info 3.3. 16
Ordered Binary Trees
Node Deletion Procedure (5)
p
q
(* Remove p^ *)
q := p;
IF
q^.Right = NIL THEN
p:= q^.Left
ELSIF q^.Left = NIL THEN
p:= q^.Right
ELSE RightMost(p^.Left)
END; (* IF *)
DISPOSE(q)
Info 3.3. 17
Ordered Binary Trees
Node Deletion Procedure (6)
p
q
r=
PROCEDURE RightMost
(VAR r:Link);
BEGIN
IF r^.Right # NIL
THEN RightMost(r^.Right)
ELSE
p^.Key := r^.Key;
q := r;
r := r^.Left
END (* IF *)
END RightMost;
Info 3.3. 18
Ordered Binary Trees
Node Deletion Procedure (7)
p
q
r=
PROCEDURE RightMost
(VAR r:Link);
BEGIN
IF r^.Right # NIL
THEN RightMost(r^.Right)
ELSE
p^.Key := r^.Key;
q := r;
r := r^.Left
END (* IF *)
END RightMost;
Info 3.3. 19
Ordered Binary Trees
Node Deletion Procedure (8)
p
q
X
r
X
PROCEDURE RightMost
(VAR r:Link);
BEGIN
IF r^.Right # NIL
THEN RightMost(r^.Right)
ELSE
p^.Key := r^.Key;
q := r;
r := r^.Left
END (* IF *)
END RightMost;
Info 3.3. 20
Ordered Binary Trees
Node Deletion Procedure (9)
p
q
X
r
(* Remove p^ *)
q := p;
IF
q^.Right = NIL THEN
p:= q^.Left
ELSIF q^.Left = NIL THEN
p:= q^.Right
ELSE RightMost(p^.Left)
END; (* IF *)
DISPOSE(q)
Info 3.3. 21
Balanced Trees
Perfectly balanced tree :
| NNLS - NNRS | <= 1
NNLS = Nbr Nodes in Left Subtree
NNRS = Nbr Nodes in Right Subtree
AVL tree (Adelson-Velskii & Landis) :
| HLS-HRS | <= 1
HLS = Height of Left Subtree
HRS = Height of Right Subtree
Info 3.3. 22
Perfectly Balanced Tree
All nodes should be perfectly balanced !
12/11
4/6
5/6
2/2
1/0
1/2
3/2
0/1
1/1
1/0
0/0
3/2
1/0
1/1
1/0
Info 3.3. 23
Perfectly Balanced Tree
All nodes should be perfectly balanced !
12/12
5/6
5/6
2/2
1/0
2/2
3/2
0/1
1/1
1/0
1/0
3/2
1/0
1/1
1/0
Info 3.3. 24
AVL Balanced Tree
AVL condition needs to be satisfied everywhere !
3/4
3/3
2/2
1/1
0/0
2/2
1/0
0/0
0/0
1/0
2/0
1/0
1/1
Info 3.3. 25
AVL Balanced Tree
AVL condition needs to be satisfied everywhere !
3/4
3/3
2/2
1/1
0/0
2/2
1/0
0/0
0/0
1/0
2/1
1/0
1/1
0/0
Info 3.3. 26
AVL Tree Balancing
2 different situations :
A
B
Case 1 :
imbalance between
outer subtrees
Case 2 :
imbalance between
inner and outer subtrees
Info 3.3. 27
AVL Tree Balancing
Case 1 : outer imbalance
A
B
B
A
Info 3.3. 28
AVL Tree Balancing
Case 2 : inner imbalance (1)
A
A
B
B
A
B
C
C
Inner imbalance can appear in two different situations
Info 3.3. 29
AVL Tree Balancing
Case 2 : inner imbalance (2)
C
A
B
B
A
C
Info 3.3. 30
AVL Trees
Data Declarations for Dictionary
TYPE
Link = POINTER TO Node;
Node = RECORD
Key : String;
(* other data fields *)
Left, Right : Link;
Bal : [-1,1]
(* -1:left side higher *)
(* +1:right side higher *)
END;
Info 3.3. 31
AVL Trees
Dictionary Building (1)
PROCEDURE BuildAVL
(VAR p:Link;x:String;VAR h:BOOLEAN);
BEGIN
IF p = NIL
THEN Insert node; h:= TRUE
ELSE
CASE Compare(x,p^.Key) OF
less
: BuildAVL(p^.Left,x,h);
IF h THEN adj.bal.left END|
equal : h := FALSE
|
greater: BuildAVL(p^.Right,x,h);
IF h THEN adj.bal.right END
END (* CASE *)
END; (* IF *)
END Build;
Info 3.3. 32
AVL Trees
Dictionary Building (2)
(* Insert Node *)
NEW(p);
WITH p^ DO
Key
:= x;
Left := NIL;
Right := NIL;
Bal
:= 0
END;
Info 3.3. 33
Adjust Balance Left
p^.Bal =
-1
0
+1
0
-1
0
FALSE
TRUE
FALSE
rearange
p^.Bal :=
h
:=
Info 3.3. 34
Rearange
p^Bal =
-1 to be updated
p^.Left^.Bal =
-1
-1
updated +1
rearange case 1
rearange case 2
Info 3.3. 35
AVL Trees
Dictionary Building (3)
(* Adjust Balance Left *)
CASE p^.Bal OF
+1: p^.Bal := 0;
h := FALSE
|
0: p^.Bal := -1 (* h := TRUE *) |
-1: p1 := p^.Left; (* Rearange *)
IF p1^.Bal = -1
THEN rearange, case 1
ELSE rearange, case 2
END; (* IF *)
p^.Bal := 0;
h := FALSE
END; (* CASE *)
Info 3.3. 36
AVL Trees
Rearange, case 1 (1)
P
P1
A
B
Info 3.3. 37
AVL Trees
Rearange, case 1 (2)
P
P1
p^.Left := p1^.Right
A
B
Info 3.3. 38
AVL Trees
Rearange, case 1 (3)
P
P1
p^.Left
:= p1^.Right;
p1^.Right := p;
A
B
Info 3.3. 39
AVL Trees
Rearange, case 1 (4)
P
P1
p^.Left
:= p1^.Right;
p1^.Right := p;
p^.Bal
:= 0;
A
B
Info 3.3. 40
AVL Trees
Rearange, case 1 (5)
P
P1
A
p^.Left
p1^.Right
p^.Bal
p
:=
:=
:=
:=
p1^.Right;
p;
0;
p1;
B
Info 3.3. 41
AVL Trees
Rearange, case 1 (6)
P
B
A
p^.Left
p1^.Right
p^.Bal
p
:=
:=
:=
:=
p1^.Right;
p;
0;
p1;
Info 3.3. 42
AVL Trees
Rearange, case 2 (1)
P
P1
P2
p2
:= p1^.Right;
A
B
C
Info 3.3. 43
AVL Trees
Rearange, case 2 (2)
P
P1
P2
p2
:= p1^.Right;
p1^.Right := p2^.Left
A
B
C
Info 3.3. 44
AVL Trees
Rearange, case 2 (3)
P
P1
P2
A
p2
:= p1^.Right;
p1^.Right := p2^.Left;
p2^.Left := p1;
B
C
Info 3.3. 45
AVL Trees
Rearange, case 2 (4)
P
P1
P2
A
p2
p1^.Right
p2^.Left
p^.Left
:=
:=
:=
:=
p1^.Right;
p2^.Left;
p1;
p2^.Right;
B
C
Info 3.3. 46
AVL Trees
Rearange, case 2 (4)
P
P1
P2
A
B
p2
p1^.Right
p2^.Left
p^.Left
p2^.Right
:=
:=
:=
:=
:=
p1^.Right;
p2^.Left;
p1;
p2^.Right;
p;
C
Info 3.3. 47
AVL Trees
Rearange, case 2 (5)
P
P1
P2
A
B
C
p2
:=
p1^.Right :=
p2^.Left :=
p^.Left
:=
p2^.Right :=
CASE p2^.Bal
-1: P^.Bal
p1^.Bal
+1: p^.Bal
p1^.Bal
END; (* CASE
p1^.Right;
p2^.Left;
p1;
p2^.Right;
p;
OF
:= +1;
:= 0; |
:= 0;
:= -1
*)
Info 3.3. 48
AVL Trees
Rearange, case 2 (6)
P
P1
P2
A
B
C
p2
:=
p1^.Right :=
p2^.Left :=
p^.Left
:=
p2^.Right :=
CASE p2^.Bal
-1: P^.Bal
p1^.Bal
+1: p^.Bal
p1^.Bal
END; (* CASE
p
:=
p1^.Right;
p2^.Left;
p1;
p2^.Right;
p;
OF
:= +1;
:= 0; |
:= 0;
:= -1
*)
p2;
Info 3.3. 49
AVL Trees
Rearange, case 2 (7)
P
C
B
A
p2
:=
p1^.Right :=
p2^.Left :=
p^.Left
:=
p2^.Right :=
CASE p2^.Bal
-1: P^.Bal
p1^.Bal
+1: p^.Bal
p1^.Bal
END; (* CASE
p
:=
p1^.Right;
p2^.Left;
p1;
p2^.Right;
p;
OF
:= +1;
:= 0; |
:= 0;
:= -1
*)
p2;
Info 3.3. 50
Tree Traversal
InOrder
h
l
d
b
a
j
f
c
e
g
i
n
k
m
o
(left subtree) root (right subtree)
abcdefghijklmno
Info 3.3. 51
Tree Traversal
InOrder
PROCEDURE InOrder(p:link);
BEGIN
IF p # NIL THEN
InOrder(p^.Left);
DoWhateverYouWant(p^.data);
InOrder(p^.Right)
END (* IF *)
END InOrder;
Info 3.3. 52
Tree Traversal
PreOrder
h
l
d
b
a
j
f
c
e
g
i
n
k
m
o
root (left subtree) (right subtree)
hdbacfegljiknmo
Info 3.3. 53
Tree Traversal
PreOrder
PROCEDURE PreOrder(p:link);
BEGIN
IF p # NIL THEN
DoWhateverYouWant(p^.data);
PreOrder(p^.Left);
PreOrder(p^.Right)
END (* IF *)
END PreOrder;
Info 3.3. 54
Tree Traversal
PostOrder
h
l
d
b
a
j
f
c
e
g
i
n
k
m
o
(left subtree) (right subtree) root
acbegfdikjmonlh
Info 3.3. 55
Tree Traversal
PostOrder
PROCEDURE PostOrder(p:link);
BEGIN
IF p # NIL THEN
PostOrder(p^.Left);
PostOrder(p^.Right);
DoWhateverYouWant(p^.data);
END (* IF *)
END PostOrder;
Info 3.3. 56
Expression Trees
(a+b/c)*(d-e*f)
*
-
+
a
/
b
d
c
*
e
f
For evaluation on a stack machine :
Postorder = abc/+def*-*
Info 3.3. 57
Expression Syntax
Expression
Term
Expression
+
Term
Factor
Term
*
/
Factor
Letter
(
Expression
)
Info 3.3. 58
Procedure Expression
Expression
Term
+
Expression
PROCEDURE Expression (VAR p: Link);
VAR q:Link;
BEGIN
NEW(p);Term(p^Left);
IF (Sy = '+') OR (Sy = '-')
THEN p^.Op := Sy; GetSy;
Expression(p^.Right)
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Expression;
Info 3.3. 59
Procedure Term
Term
Factor
*
Term
/
PROCEDURE Term (VAR p: Link);
VAR q:Link;
BEGIN
NEW(p);Factor(p^Left);
IF (Sy = '*') OR (Sy = '/')
THEN p^.Op := Sy; GetSy;
Term(p^.Right)
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Term;
Info 3.3. 60
Procedure Factor
Factor
Letter
(
Expression
)
PROCEDURE Factor (VAR p: Link);
BEGIN
IF Sy = '('
THEN GetSy; Expression(p); GetSy
ELSE NEW(p); p^.Op:= Sy;
p^.Left:= NIL; p^.Right:= NIL
GetSy
END (* IF *)
END Factor;
Info 3.3. 61
(a+b/c)*(d-e/f)
^
PROCEDURE Expression
(VAR p: Link);
...
NEW(p);Term(p^Left);
...
Expression
Info 3.3. 62
(a+b/c)*(d-e/f)
^ (VAR p: Link);
PROCEDURE Term
...
NEW(p);Factor(p^Left);
...
Term
Expression
Info 3.3. 63
(a+b/c)*(d-e/f)
.^ (VAR p: Link);
PROCEDURE Factor
...
IF Sy = '('
THEN GetSy; Expression(p); GetSy
...
Factor
Term
Expression
Info 3.3. 64
(a+b/c)*(d-e/f)
.^ (VAR p: Link);
PROCEDURE Expression
...
NEW(p);Term(p^Left);
...
Expression
Factor
Term
Expression
Info 3.3. 65
(a+b/c)*(d-e/f)
.^(VAR p: Link);
PROCEDURE Term
...
NEW(p);Factor(p^Left);
...
Term
Expression
Factor
Term
Expression
Info 3.3. 66
(a+b/c)*(d-e/f)
..^(VAR p: Link);
PROCEDURE Factor
...
IF Sy = '('
...
ELSE NEW(p); p^.Op:= Sy;
p^.Left:= NIL; p^.Right:= NIL
GetSy
END (* IF *)
END Factor;
Factor
Term
Expression
Factor
Term
Expression
a
Info 3.3. 67
(a+b/c)*(d-e/f)
..^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
IF (Sy = '*') OR (Sy = '/')
...
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Term;
a
Term
Expression
Factor
Term
Expression
Info 3.3. 68
(a+b/c)*(d-e/f)
...^ (VAR p: Link);
PROCEDURE Expression
...
NEW(p);Term(p^Left);
IF (Sy = '+') OR (Sy = '-')
THEN p^.Op := Sy; GetSy;
Expression(p^.Right)
...
+
a
Expression
Factor
Term
Expression
Info 3.3. 69
(a+b/c)*(d-e/f)
...^ (VAR p: Link);
PROCEDURE Expression
...
NEW(p);Term(p^Left);
...
+
a
Expression
Expression
Factor
Term
Expression
Info 3.3. 70
(a+b/c)*(d-e/f)
...^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
...
+
a
Term
Expression
Expression
Factor
Term
Expression
Info 3.3. 71
(a+b/c)*(d-e/f)
....^
PROCEDURE Factor
(VAR p: Link);
...
IF Sy = '('
...
ELSE NEW(p); p^.Op:= Sy;
p^.Left:= NIL; p^.Right:= NIL
GetSy
END (* IF *)
END Factor;
+
a
Factor
Term
Expression
Expression
Factor
Term
Expression
b
Info 3.3. 72
(a+b/c)*(d-e/f)
.....^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
IF (Sy = '*') OR (Sy = '/')
THEN p^.Op := Sy; GetSy;
Term(p^.Right)
...
+
a
Term
Expression
Expression
Factor
Term
Expression
/
b
Info 3.3. 73
(a+b/c)*(d-e/f)
.....^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
...
+
a
Term
Term
Expression
Expression
Factor
Term
Expression
/
b
Info 3.3. 74
(a+b/c)*(d-e/f)
......^
PROCEDURE Factor
(VAR p: Link);
...
IF Sy = '('
...
ELSE NEW(p); p^.Op:= Sy;
p^.Left:= NIL; p^.Right:= NIL
GetSy
END (* IF *)
END Factor;
Factor
Term
Term
Expression
Expression
Factor
Term
Expression
+
a
/
b
c
Info 3.3. 75
(a+b/c)*(d-e/f)
......^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
IF (Sy = '*') OR (Sy = '/')
...
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Term;
+
a
Term
Term
Expression
Expression
Factor
Term
Expression
/
b
c
Info 3.3. 76
(a+b/c)*(d-e/f)
......^
PROCEDURE Term
(VAR p: Link);
...
IF
THEN
Term(p^.Right)
...
END (* IF *)
END Term;
+
a
Term
Expression
Expression
Factor
Term
Expression
/
b
c
Info 3.3. 77
(a+b/c)*(d-e/f)
......^
PROCEDURE Expression
(VAR p: Link);
...
IF (Sy = '+') OR (Sy = '-')
...
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Expression;
+
a
/
Expression
Expression
Factor
Term
Expression
b
c
Info 3.3. 78
(a+b/c)*(d-e/f)
......^
PROCEDURE Expression
(VAR p: Link);
...
IF (Sy = '+') OR (Sy = '-')
...
ELSE q:= p; p:= p^.Left; DISPOSE(q)
END (* IF *)
END Expression;
+
a
/
b
c
Expression
Expression
Factor
Term
Expression
Info 3.3. 79
(a+b/c)*(d-e/f)
......^
PROCEDURE Expression
(VAR p: Link);
...
IF
THEN
Expression(p^.Right)
...
END (* IF *)
END Expression;
+
a
/
b
c
Expression
Factor
Term
Expression
Info 3.3. 80
(a+b/c)*(d-e/f)
.......^
PROCEDURE Factor
(VAR p: Link);
...
IF Sy = '('
THEN GetSy; Expression(p); GetSy
END (* IF *)
END Factor;
+
a
/
b
c
Factor
Term
Expression
Info 3.3. 81
(a+b/c)*(d-e/f)
.......^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
IF (Sy = '*') OR (Sy = '/')
THEN p^.Op := Sy; GetSy;
Term(p^.Right)
...
*
+
a
/
b
c
Term
Expression
Info 3.3. 82
(a+b/c)*(d-e/f)
........^
PROCEDURE Term
(VAR p: Link);
...
NEW(p);Factor(p^Left);
...
*
+
a
/
b
c
Term
Term
Expression
Info 3.3. 83
(a+b/c)*(d-e/f)
...............^
*
-
+
a
d
/
b
c
/
e
f
Info 3.3. 84