Vous êtes sur la page 1sur 43

ECE 3231 Algorithms & Programming

Binary Search Trees

A Taxonomy of Trees
General Trees any number of children / node Binary Trees max 2 children / node

Binary Search Trees

Review :Binary Tree


A binary tree is a tree with the following properties:
Each internal node has at most two children (degree of two) The children of a node are an ordered pair

Applications:
arithmetic expressions decision processes searching
A

We call the children of an internal node left child and right child Alternative recursive definition: a binary tree is either
a tree consisting of a single node, OR a tree whose root has an ordered pair of children, each of which is a binary tree B

Review :Binary Tree ADT


The BinaryTree ADT extends the Tree ADT, i.e., it inherits all the methods of the Tree ADT Additional methods:
position leftChild(p) position rightChild(p) position sibling(p)

Update methods may be defined by data structures implementing the BinaryTree ADT

Review : Maximum Number of Nodes in a Binary Tree


The maximum number of nodes on depth i of a binary tree is 2i, i>=0.
The maximum nubmer of nodes in a binary tree of height k is 2k+1-1, k>=0.

Prove by induction.
2i 2 k 1 1
i 0 k

Full Binary Tree


A full binary tree of a given height k has 2k+11 nodes.

Height 3 full binary tree.

Labeling Nodes In A Full Binary Tree


Label the nodes 1 through 2k+1 1. Label by levels from top to bottom. Within a level, label from left to right.
1

2 4 8 9 10 6 11 12 13

7 14 15

Node Number Properties


1

2 4 8 9 10 6 11 12 13

7 14 15

Parent of node i is node i / 2, unless i = 1. Node 1 is the root and has no parent.

Node Number Properties


1

4
8 9 10

5 11 12

6
13 14

7 15

Left child of node i is node 2i, unless 2i > n, where n is the number of nodes. If 2i > n, node i has no left child.

Node Number Properties


1

2 4 8 9 10 6 11 12 13

7 14 15

Right child of node i is node 2i+1, unless 2i+1 > n, where n is the number of nodes. If 2i+1 > n, node i has no right child.

Complete Binary Trees


A labeled binary tree containing the labels 1 to n with root 1, branches leading to nodes labeled 2 and 3, branches from these leading to 4, 5 and 6, 7, respectively, and so on. A binary tree with n nodes and level k is complete iff its nodes correspond to the nodes numbered from 1 to n in the full binary tree of level k.

1 2 4 8 9 3 2 7 8 4 5

1 3 6 7

10

11

12 13 14 15

Complete binary tree

Full binary tree of depth 3

Binary Tree Traversals


Let l, R, and r stand for moving left, visiting the node, and moving right. There are six possible combinations of traversal
lRr, lrR, Rlr, Rrl, rRl, rlR

Adopt convention that we traverse left before right, only 3 traversals remain
lRr, lrR, Rlr inorder, postorder, preorder

Inorder Traversal
In an inorder traversal a node is visited after its left subtree and before its right subtree

Algorithm inOrder(v) if isInternal (v) inOrder (leftChild (v)) visit(v) if isInternal (v) inOrder (rightChild (v))
8

6 2 1 3 4 5 7

Print Arithmetic Expressions


Specialization of an inorder traversal
print operand or operator when visiting node print ( before traversing left subtree print ) after traversing right subtree

2 a 1 3 b

Algorithm inOrder (v) if isInternal (v){ print(() inOrder (leftChild (v))} print(v.element ()) if isInternal (v){ inOrder (rightChild (v)) print ())}

((2 (a 1)) (3 b))

Evaluate Arithmetic Expressions


recursive method returning the value of a subtree when visiting an internal node, combine the values of the subtrees Algorithm evalExpr(v) if isExternal (v) return v.element () else x evalExpr(leftChild (v)) y evalExpr(rightChild (v)) operator stored at v return x y

2 5 1 3 2

Binary search Trees BST


Binary search tree
Every element has a unique key. The keys in a nonempty left subtree (right subtree) are smaller (larger) than the key in the root of subtree. The left and right subtrees are also binary search trees.

Binary Search Trees

<
2 1

6 9 4 8

>

Binary Search Trees

17

Binary Search Trees


Binary Search Trees (BST) are a type of Binary Trees with a special organization of data. This data organization leads to O(log n) complexity for searches, insertions and deletions in certain types of the BST (balanced trees).
O(h) in general

Binary Search Algorithm


Binary Search algorithm of an array of sorted items reduces the search space by one half after each comparison

34 0

41 1

56 2

63 3

72 4

89 5

95 6

34 0

41 1

56 2

72 89 4 5

95 6

34 0

56 2

72 4

95 6

Organization Rule for BST


the values in all nodes in the left subtree of a node are less than the node value the values in all nodes in the right subtree of a node are greater than the node values 63

41

89

34

56

72

95

Binary Tree
typedef struct tnode *ptnode; typedef struct node { short int key; ptnode right, left; }; sample binary search tree code

BST Operations: Search


Searching in the BST method search(key) implements the binary search based on comparison of the items in the tree the items in the BST must be comparable (e.g integers, string, etc.)

The search starts at the root. It probes down, comparing the


values in each node with the target, till it finds the first item equal to the target. Returns this item or null if there is none.

Search in BST - Pseudocode


if the tree is empty return NULL
else if the item in the node equals the target return the node value else if the item in the node is greater than the target return the result of searching the left subtree else if the item in the node is smaller than the target return the result of searching the right subtree

Search in a BST: C code


Ptnode search(ptnode root, int key) { /* return a pointer to the node that contains key. If there is no such node, return NULL */ if (!root) return NULL; if (key == root->key) return root; if (key < root->key) return search(root->left,key); return search(root->right,key); }

BST Operations: Insertion


method insert(key) places a new item near the frontier of the BST while retaining its organization of data: starting at the root it probes down the tree till it finds a node whose left or right pointer is empty and is a logical place for the new value uses a binary search to locate the insertion point is based on comparisons of the new item and values of nodes in the BST

Elements

in nodes must be comparable!

Case 1: The Tree is Empty Set the root to a new node containing the item Case 2: The Tree is Not Empty Call a recursive helper method to insert the item 10 > 7
10 7 5 9 10 > 9

10

Insertion in BST - Pseudocode


if tree is empty create a root node with the new key else compare key with the top node if key = node key replace the node with the new value else if key > node key compare key with the right subtree: if subtree is empty create a leaf node else add key in right subtree else key < node key compare key with the left subtree: if the subtree is empty create a leaf node else add key to the left subtree

Insertion into a BST: C code


void insert (ptnode *node, int key) { ptnode ptr, temp = search(*node, key); if (temp || !(*node)) { ptr = (ptnode) malloc(sizeof(tnode)); if (IS_FULL(ptr)) { fprintf(stderr, The memory is full\n); exit(1); } ptr->key = key; ptr->left = ptr->right = NULL; if (*node) if (key<temp->key) temp->left=ptr; else temp->right = ptr; else *node = ptr; } }

BST Shapes

The order of supplying the data determines where it is placed in the BST , which determines the shape of the BST Create BSTs from the same set of data presented each time in a different order: a) 17 4 14 19 15 7 9 3 16 10 b) 9 10 17 4 3 7 14 16 15 19

c) 19 17 16 15 14 10 9 7 4 3 can you guess this shape?

BST Operations: Removal

removes a specified item from the BST and adjusts the tree uses a binary search to locate the target item: starting at the root it probes down the tree till it finds the target or reaches a leaf node (target not in the tree) removal of a node must not leave a gap in the tree,

Removal in BST - Pseudocode


method remove (key)
I if the tree is empty return false II Attempt to locate the node containing the target using the binary search algorithm if the target is not found return false else the target is found, so remove its node: Case 1: if the node has 2 empty subtrees replace the link in the parent with null Case 2: if the node has a left and a right subtree - replace the node's value with the max value in the left subtree - delete the max node in the left subtree

Removal in BST - Pseudocode


Case 3: if the node has no left child - link the parent of the node - to the right (non-empty) subtree Case 4: if the node has no right child - link the parent of the target - to the left (non-empty) subtree

Removal in BST: Example


Case 1: removing a node with 2 EMPTY SUBTREES parent

7 5 4 6 8 9 10

cursor

Removing 4 replace the link in the parent with null

7
5 9

10

Removal in BST: Example


Case 2: removing a node with 2 SUBTREES - replace the node's value with the max value in the left subtree - delete the max node in the left subtree What other element can be used as Removing 7 replacement? cursor cursor
7 5 9 5 6 9

10

10

Removal in BST: Example


Case 3: removing a node with 1 EMPTY SUBTREE
the node has no left child: link the parent of the node to the right (non-empty) subtree parent parent 7 7 9 6 8 10 cursor 5 6 8 9 10

cursor
5

Removal in BST: Example

Case 4: removing a node with 1 EMPTY SUBTREE


the node has no right child: link the parent of the node to the left (non-empty) subtree

Removing 5
parent

parent 7 cursor 9 5 7 9

cursor
5

10

10

Removal in BST: C code

Analysis of BST Operations


The complexity of operations get, insert and remove in BST is O(h) , where h is the height.
O(log n) when the tree is balanced. The updating operations cause the tree to become unbalanced. The tree can degenerate to a linear shape and the operations will become O (n)

Best Case
BST tree = new BST(); tree.insert tree.insert tree.insert tree.insert tree.insert tree.insert tree.insert ("E"); ("C"); ("D"); ("A"); ("H"); ("F"); ("K"); >>>> Items in advantageous order: K H F E D C A

Output:

Worst Case
BST tree = new BST(); for (int i = 1; i <= 8; i++) tree.insert (i);

Output:

>>>> Items in worst order: 8 7 6 5 4 3 2 1

Random Case
tree = new BST (); for (int i = 1; i <= 8; i++) tree.insert(random());

Output:

>>>> Items in random order:


X U P

O
H F B

Applications for BST


Sorting with binary search trees
Input: unsorted array Output: sorted array

Algorithm ? Running time ?

Better Search Trees

Prevent the degeneration of the BST : A BST can be set up to maintain balance during updating operations (insertions and removals) Types of ST which maintain the optimal performance:
splay trees AVL trees 2-4 Trees Red-Black trees B-trees

Vous aimerez peut-être aussi