Binary Trees

Download Report

Transcript Binary Trees

Binary Trees
Terminology
• A graph G = <V,E> is a collection of nodes and edges. An
edge (v1,v2) is a pair of vertices that are directly connected.
• A path, P, is a sequence of vertices <v1,v2,…,vn> where and
(vi,vi+1) is an edge of G. A path <v1,v2,…,vn,v1> is a cycle.
• A tree is a graph without cycles. The Root is a
distinguished node of the tree. The Parent is the adjacent
node that is closer to the root. A Leaf is a node without
children. A child is an adjacent node that is further from
the root. The level of a vertex is the length of the path from
the root.
• A binary tree is a tree with at most two children
Advantage of Trees
Assuming Deletions exclude time for Find
• Ordered Array
– Insert O(N), Delete O(N), Find O(Lg N).
• Unordered Array
– Insert O(1), Delete O(1), Find O(N).
• Linked List
– Insert O(1), Delete O(1), Find O(N).
• Binary Trees
– Insert O(1), Delete O(1), Find O(lg N) in most cases.
– Question: When would Find not take place in O(Lg N)?
Note: the above insert and removed complexities don’t include the find
Tree Structure
Question: Can a Tree be implemented using an array?
typedef struct TreeNode
{ Key key;
Data data;
struct TreeNode left;
struct TreeNode right;
} Tree
Top of the Tree: Tree root;
Basic Tree Abstract Data Type Methods
Node find(Key key) {}
Item insert(Key key, Data data ) {}
Item delete(Key key) {}
Binary Tree Find
Node find( Key key)
{ Node *current = root, *previous;
previous = null;
if (current == null) return null;
while(!equal(current->key, key))
{ previous = current
if (greater(current->key, key)) current = current->left;
else current = current->right;
if (current == null) return previous;
}
Notes
return previous
-> in C is equivalent to “.” in Java
}
Java has no equivalent to “.” in C
Binary Tree Insertion/Deletion
pseudo code
• Insert node
Perform Find
If node was found, Return false
If tree was empty, Set root = node
Else If node < leaf node returned by Find
Link node to left child of leaf, Return true
Else Link node to right child of leaf, Return true
• Delete node
Perform Find
If node was not found, Return false
If node was a leaf, Unlink parent left or right pointer, Return true
If node had one child, Link child to appropriate parent pointer, Return
true
Find and Remove successor
Replace node with successor in the tree, Return true
Other Search Tree Operations
• Find Minimum:
– Go left until the leaf is found
• Find Maximum:
– Go right until the leaf is found
• Predecessor:
– Go left, and the proceed right until the leaf is found
• Successor:
– Go right, and then proceed left until the leaf is found
Binary Tree Traversal
See Tree Example in Text
• Preorder Traversal
– Recursively Call until leaf is found
– Recursive step
• Visit, Traversal(Left), Traversal(Right)
• Inorder (Traversal(left), Visit, Traversal(right))
• Postorder (Traversal(left), Traversal(right), Visit)