230 likes | 242 Views
Trees. What is a Tree? Tree terminology Why trees? What is a general tree? Implementing trees Binary trees Binary tree implementation Application of Binary trees. A. E. B. D. C. F. H. G. What is a Tree?.
E N D
Trees • What is a Tree? • Tree terminology • Why trees? • What is a general tree? • Implementing trees • Binary trees • Binary tree implementation • Application of Binary trees
A E B D C F H G What is a Tree? • A tree, is a finite set of nodes together with a finite set of directed edges that define parent-child relationships. Each directed edge connects a parent to its child. Example: Nodes={A,B,C,D,E,f,G,H} Edges={(A,B),(A,E),(B,F),(B,G),(B,H), (E,C),(E,D)} • A directed path from node m1 to node mk is a list of nodes m1, m2, . . . , mk such that each is the parent of the next node in the list. The length of such a path is k - 1. • Example: A, E, C is a directed path of length 2.
5 5 3 3 2 2 4 4 1 1 6 6 What is a Tree? (contd.) • A tree satisfies the following properties: • It has one designated node, called the root, that has no parent. • Every node, except the root, has exactly one parent. • A node may have zero or more children. • There is a unique directed path from the root to each node. 5 1 3 2 4 6 tree Not a tree Not a tree
A Ancestors of G proper ancestors of E C B G F D E Tree Terminology • Ordered tree: A tree in which the children of each node are linearly ordered (usually from left to right). • Ancestor of a node v: Any node, including v itself, on the path from the root to the node. • Proper ancestor of a node v: Any node, excluding v, on the path from the root to the node. An Ordered Tree
A A C C B B G G F F D D E E subtrees of node A Tree Terminology (Contd.) • Descendant of a node v: Any node, including v itself, on any path from the node to a leaf node (i.e., a node with no children). • Proper descendant of a node v: Any node, excluding v, on any path from the node to a leaf node. • Subtree of a node v: A tree rooted at a child of v. Proper descendants of node B Descendants of a node C
A A A A proper ancestors of node H parent of node D grandfather of nodes I,J B B C C D D E E G G F F proper descendants of node C I I H H child of node D J J grandchildren of node C Tree Terminology (Contd.) subtrees of A
A A Siblings of E B C D E G F I H J Tree Terminology (Contd.) • Each of node D and B has degree 1. • Each of node A and E has degree 2. • Leaf: A node with degree 0. • Internal or interior node: a node with degree greater than 0. • Siblings: Nodes that have the same parent. • Size: The number of nodes in a tree. • node C has degree 3. • Each of node F,G,H,I,J has degree 0. Siblings of A An Ordered Tree with size of 10
Level 0 Level 1 Level 2 Level 3 Level 4 A A B C D E F G I H J k Tree Terminology (Contd.) • Level (or depth) of a node v: The length of the path from the root to v. • Height of a node v: The length of the longest path from v to a leaf node. • Height of a node v: The length of the longest path from v to a leaf node. • The height of a tree is the height of its root mode. • By definition the height of an empty tree is -1. • The height of the tree is 4. • The height of node C is 3.
Why Trees? • Trees are very important data structures in computing. • They are suitable for: • Hierarchical structure representation, e.g., • File directory. • Organizational structure of an institution. • Class inheritance tree. • Problem representation, e.g., • Expression tree. • Game tree. • Decision tree. • Efficient algorithmic solutions, e.g., • Search trees. • Efficient priority queues via heaps.
GeneralTree NaryTree BinaryTree Implementing Trees • The various classes of trees are viewed as classes of containers as shown below: MyComparable AbstractObject Container AbstractContainer Tree AbstractTree
Implementing Trees (Contd.) • The tree interface is defined as: 1 public interface Tree extends Container 2 { 3 Object getKey( ) ; 4 Tree getSubtree(int i) ; 5 boolean isEmpty( ) ; 6 boolean isLeaf( ) ; 7 int getDegree( ) ; 8 int getHeight( ) ; 9 void depthFirstTraversal(PrePostVisitor visitor) ; 10 void breadthFirstTraversal(Visitor visitor) ; 11 }
Implementing Trees (Contd.) • The AbstractTree class skeleton is: 1 public abstract class AbstractTree extends AbstractContainer implements Tree 2 { 3 public void depthFirstTraversal(PrePostVisitor visitor){ 4 // . . . 5 } 6 public void breadthFirstTraversal(Visitor visitor){ 7 // . . . 8 } 9 public void accept(Visitor visitor){ 10 // . . . 11 } 12 public Enumeration getEnumeration( ){ 13 // . . . 14 } 15 // . . . 16 }
General Trees • A general tree is an ordered tree whose set of nodes cannot be empty. • In a general tree, there is no limit to the number of children that a node can have. • Representing a general tree by linked lists: • Each node has a linked list of the subtrees of that node. 1 public class GeneralTree extends AbstractTree 2 { 3 protected Object key ; 4 protected int degree ; 5 protected LinkedList list ; 6 // . . . 7 }
D E F H G J K L M K General Trees (Contd.) • An example of a general tree:
2 5 9 5 B 7 D D F C G B J E A N-ary Trees • An N-ary tree is an ordered tree that is either: • Empty, or • It consists of a root node and at most N non-empty N-ary subtrees. • It follows that the degree of each node in an N-ary tree is at most N. • Example of N-ary trees: 3-ary (tertiary)tree 2-ary (binary) tree
N-ary Trees (Contd.) 1 public class NaryTree extends AbstractTree{ 2 protected Object key ; 3 protected int degree ; 4 protected NaryTree[ ] subtree ; 5 public NaryTree(int degree){ 6 key = null ; this.degree = degree ; 8 subtree = null ; 9 } 10 public NaryTree(int degree, Object key){ 11 this.key = key ; 12 this.degree = degree ; 13 subtree = new NaryTree[degree] ; 14 for(int i = 0; i < degree; i++) subtree[i] = new NaryTree(degree); 15 } 16 // . . . 17 }
2 5 9 5 7 Binary Trees • A binary tree is an N-ary tree for which N = 2. • Thus, a binary tree is either: • An empty tree, or • A tree consisting of a root node and at most two non-empty binary subtrees. Example:
Binary Trees (Contd.) • A full binary tree is either an empty binary tree or a binary tree in which each level k, k > 0, has 2k nodes. • A complete binary tree is either an empty binary tree or a binary tree in which: • Each level k, k > 0, other than the last level contains the maximum number of nodes for that level, that is 2k. • The last level may or may not contain the maximum number of nodes. • If a slot with a missing node is encountered when scanning the last level in a left to right direction, then all remaining slots in the level must be empty. • Thus, every full binary tree is a complete binary tree, but the opposite is not true.
Binary Trees (Contd.) • Example showing the growth of a complete binary tree:
+ a * d - b c Binary Trees Implementation • A binary tree can be represented using a linked list. 1 public class BinaryTree extends AbstractTree{ 2 protected Object key ; 3 protected BinaryTree left , 4 protected BinaryTree right ; 5 public BinaryTree(Object key, BinaryTree left, BinaryTree right){ 6 this.key = key ; 7 this.left = left ; this.right = right ; 8 } 9 public BinaryTree( ) 10 { this(null, null, null) ;} 11 12 public BinaryTree(Object key){ 13 this(key, new BinaryTree( ), new BinaryTree( )); } 14 // . . . 15 } Example: A binary tree representing a + (b - c) * d
Binary Trees Implementation (Contd.) • Some methods of BinaryTree class: 1 public boolean isEmpty( ) 2 { return key == null ; } 3 public boolean isLeaf( ) 4 { return ! isEmpty( ) && left.isEmpty( ) && right.isEmpty( ) ; } 5 public Object getKey( ){ 6 if(isEmpty( )) 7 throw new InvalidOperationException( ) ; 8 else 9 return key ;} 10 11 public int getHeight( ){ 12 if(isEmpty( )) 13 return -1 ; 14 else 15 return 1 + Math.max(left.getHeight( ), right.getHeight( )) ; 16 } 17 public void attachKey(Object obj){ 18 if(! isEmpty( )) 19 throw new InvalidOperationException( ) ; 20 else{ 21 key = obj ; 22 left = new BinaryTree( ) ; 23 right = new BinaryTree( ) ; 24 } 25 }
Binary Trees Implementation (Contd.) 26 public Object detachKey( ) 27 { 28 if(! isLeaf( )) 29 throw new InvalidOperationException( ) ; 30 else 31 { 32 Object obj = key ; 33 key = null ; 34 left = null ; 35 right = null ; 36 return obj ; 37 } 38 } 39 public BinaryTree getLeft( ) 40 { 41 if(isEmpty( )) 42 throw new InvalidOperationException( ) ; 43 else 44 return left ; 45 } 46 public BinaryTree getRight( ) 47 { 48 if(isEmpty( )) 49 throw new InvalidOperationException( ) ; 50 else 51 return right ; 52 }
Condition1 false True decision1 Condition2 false True decision2 Condition3 b c + d * - a false True decision3 decision4 Application of Binary Trees • Binary trees have many important uses. Two examples are: • Binary decision trees. • Internal nodes are conditions. Leaf nodes denote decisions. • Expression Tree