You are on page 1of 23

BINARY TREES

ตนไมแบบทวิภาค (Binary Trees)


A binary tree is either empty or it consists of a node called
the root together with two binary trees called the left
subtree and the right subtree of the root.

S. Prasitjutrakul 1994
Binary Trees
Jim

Amy Kim

Guy Kay Sam

Boy

typedef struct NodeTag {


ItemType info;
struct NodeTag *pLeft;
struct NodeTag *pRight;
} NodeType;
S. Prasitjutrakul 1994
Traversal of Binary Trees
! แบบกอนลําดับ (preorder)
! แบบตามลําดับ (inorder)
A
! แบบหลังลําดับ (postorder)

B C
root

D E G
left right F

H I J K

Pre( root ) = root Pre( left ) Pre( right )


In( root ) = In( left ) root In( right )
Post( root ) = Post( left ) Post( right ) root

S. Prasitjutrakul 1994
Traversal of Binary Trees
void Preorder( NodeType *pRoot )
{
if ( pRoot ) {
Visit( pRoot );
Preorder( pRoot->pLeft );
Preorder( pRoot->pRight ); pRoot
}
}
void Inorder( NodeType *pRoot )
{ pRoot->pLeft pRoot->pRigh
if ( pRoot ) {
Inorder( pRoot->pLeft );
Visit( pRoot );
Inorder( pRoot->pRight );
}
}
void Postorder( NodeType *pRoot )
{
if ( pRoot ) {
Postorder( pRoot->pLeft ); S. Prasitjutrakul 1994
Traversal of Binary Trees
G

D J

B F I M

K
A C E H
L

Preorder : G D B A C F E J I H N K L

Inorder : A B C D E F G H I J K L M

Postorder : A C B E F D H I L K N J G

S. Prasitjutrakul 1994
Expression Trees
/
log !

+ ×

H N
- ?
log H N! 2 A

-
B 0.5
+ AND ? ×

× < × C
A B 2

B C A B C D 4 A
-B+(B ? 2 - 4×A×C)? 0.5
A + ( B × C ) (A<B) AND (C>D)
2×A

S. Prasitjutrakul 1994
Expression Tree & Tree Traversal
-

/
E
× +

A B C D

Inorder : A × B / C + D - E

Preorder : - / × A B + C D E

Postorder : A B × C D + / E -

S. Prasitjutrakul 1994
ตนไมคนหาแบบทวิภาค (Binary Search Tree)
Jim

Amy Kim

Guy Kay Sam

Boy คียมีคามากกวา
คียมีคานอยกวา "Jim"
"Jim"
typedef struct NodeTag {
ItemType info;
struct NodeTag *pLeft;
struct NodeTag *pRight;
} NodeType;
S. Prasitjutrakul 1994
Binary Search Trees
Kay Amy

Amy Kim Boy

Guy
Jim Sam
Jim

Guy
Jim Kay

Kim
Boy Boy Kim

Sam

Amy Guy Kay Sam

S. Prasitjutrakul 1994
TreeSearch
NodeType *TreeSearch( NodeType *p, KeyType Target )
{
if ( p ) {
if ( LT( Target, p->info.key ) )
p = TreeSearch( p->pLeft, Target );
else if ( GT( Target, p->info.key ) )
p = TreeSearch( p->pRight, Target );
}
return( p );
}

NodeType *TreeSearch( NodeType *p, KeyType Target )


{
while ( p != NULL && NE( Target, p->info.key ) ) {
if ( LT( Target, p->info.key ) )
p = p->pLeft;
else
p = p->pRight;
}
return( p ); S. Prasitjutrakul 1994
Insertion into a Binary Search Tree
NodeType *Insert( NodeType *pRoot, NodeType *pNewNode )
{
if ( pRoot == NULL ) {
pRoot = pNewNode;
pRoot->pLeft = pRoot->pRight = NULL;
}
else if ( LT( pNewNode->info.key, pRoot->info.key ) )
pRoot->pLeft = Insert( pRoot->pLeft, pNewNode );
else if ( GT( pNewNode->info.key, pRoot->info.key ) )
pRoot->pRight = Insert( pRoot->pRight, pNewNode );
else
Error( "Duplicate key" ); pRoot
Jim
return( pRoot );
}
Boy Kim pNewNode

Amy Guy Kay Jan

S. Prasitjutrakul 1994
Deletion from a Binary Search Tree
Jim Jim

Boy Kim Boy Kim

Amy Guy Kay Amy Guy Kay

pNode
Jan

กรณีที่ *pNode เปนใบ

S. Prasitjutrakul 1994
Deletion from a Binary Search Tree
Jim Jim
pNode

Boy Kim Boy

Amy Guy Kay Amy Guy Kay

Jan Jan

กรณีที่ตนไมยอยขางหนึ่ง
ของ *pNode ไมมี

S. Prasitjutrakul 1994
Deletion from a Binary Search Tree
pNode Jim Jim

Boy Kim Guy Kim

Amy Guy Kay Dan Jan Kay

Dan Jan Amy

กรณีที่ *pNode มีตนไม


ยอยทั้งสองขาง

S. Prasitjutrakul 1994
Deletion from a Binary Seach Tree

N N N
K K S

K S

S. Prasitjutrakul 1994
Deletion from a Binary Search Tree
G G

D J D J

B F I M B F I M

A C E H K A C E H K

Inorder : A B C D E F G H I J K L

ถาจะลบ G จะสรุปไดเสมอวา F และ H จะมี


ตนไมยอยอยางมากเพียงหนึ่งตน

S. Prasitjutrakul 1994
Treesort
1. รับขอมูลที่ตองการเรียงลําดับ
2. สรางตนไมคนหาแบบทวิภาคจากขอมูลเหลานั้น
3. แวะผานขอมูลในตนไม แบบตามลําดับ
K K K K K

G G G G U

H E H E H

K K K
K G H E U I A C

G U G U G U

E H E H E H

I A I A I

C S. Prasitjutrakul 1994
Treesort vs. Quicksort
K G H E U I A C
K
G H E I A C K U

G U E A C G H I K U

A C E G H I K U
E H
A C E G H I K U

A I A C E G H I K U

A C E G H I K U
C
A C E G H I K U

A C E G H I K U

S. Prasitjutrakul 1994
Building a Binary Search Tree

1 2 3 4 5 6 7 8 9 10 11 12 13

4 12

2 6 10 13

1 3 5 7 9 11

S. Prasitjutrakul 1994
Building a Binary Search Tree
16

8 24

4 12 20 28

2 6 10 14 18 22 26 30

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31

ถากําหนดใหเลขประจํา node ตางๆในตนไมแบบทวิภาคบริบูรณ (complete binary tree) ที่มี


ความสูง h ตรงตามลําดับของการแวะผานแบบตามลําดับ (inorder) จะไดวา เลขประจํา node ที่
h-k
อยูในระดับที่ k จะหารดวย 2 ลงตัว แตจะหารดวย 2 +1 ไมลงตัว
h-k

S. Prasitjutrakul 1994
Building a Binary Search Tree
4 4 4 4

2 2 2 2 2 6 2 6

1 1 1 3 1 3 1 3 5 1 3 5 1 3 5 7

8 8 8 8

4 4 4 4

2 6 2 6 2 6 10 2 6 10

1 3 5 7 1 3 5 7 9 1 3 5 7 9 1 3 5 7 9

1 2 3 4 5 6 7 8 9 10

S. Prasitjutrakul 1994
Randomly Built Binary Search Trees

S(n) = จํานวนการเปรียบเทียบเฉลี่ย ในกรณีพบขอมูล


U(n) = จํานวนการเปรียบเทียบเฉลี่ย ในกรณีไมพบขอมูล
2I 2E 2I 2E
S(n) = +1 U (n) = E = I + 2n ( ) = +1 Un
Sn ( )= E=I +2n
n n+1 n n+1
F1+ 1IJU (n) − 3
S(n) = G
F
G IJ1
H nK
Sn
HK
( ) = 1+ Un
n
( )−3

U (0) + U (1) +... +U (n − 1) U(0)+U(1)+...+Un


( −1)
S(n) = 1+ ( ) =1+
Sn
n n
(n + 1)U (n) = 4n + U (0) + U (1) + ...U (n − 1) (n+1)Un
( ) =4n+U(0)+U() 1+...Un
( −1)
nU (n − 1) = 4(n − 1) + U (0) + U (1) +... +U (n − 2) nU(n−1) =4(n−1)+U(0)+U() 1+...+Un
( −2)

S. Prasitjutrakul 1994

You might also like