1 / 39

Tree

Tree. Outline. Tree Data Structure Examples Terminology & Definition Binary Tree Tree Traversal Tree Iterators. Trees: Some Examples. A tree represents a hierarchy, for example: Organizational structure of a company. Trees: Some Examples. Table of contents of a book.

Télécharger la présentation

Tree

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tree

  2. Outline • Tree Data Structure • Examples • Terminology & Definition • Binary Tree • Tree Traversal • Tree Iterators

  3. Trees: Some Examples • A tree represents a hierarchy, for example: • Organizational structure of a company

  4. Trees: Some Examples • Table of contents of a book

  5. Trees: Some Examples • File system (Unix, Windows, Internet)

  6. Trees: Terminology • Ais the root node • Bis the parentof D and E • Cis the siblingof B • Dand E are the children of B • D, E, F, G, I are external nodes, or leaves • A, B, C, Hare internal nodes • The depth, level, orpath length of Eis 2 • The heightof the tree is 3 • The degreeof node Bis 2 Property: |edges| = |nodes| - 1

  7. Trees: Viewed Recursively A sub-tree is also a tree!!

  8. Binary Trees • Binary tree: tree with all internal nodes of degree 2 • Recursive View: a binary tree is either • empty • an internal node (the root) and two binary trees(left subtree and right subtree)

  9. Binary Trees: An Example • Arithmetic expression

  10. Binary Trees: Properties • If we restrict that each parent can have two and only two children, then: • |external nodes| = |internal nodes| + 1 • |nodes at level i|  2i • |external nodes|  2 (height) • height  log2 |external nodes| • height  log2 |nodes| - 1 • height  |internal nodes| = (|nodes| - 1)/2

  11. Traversing Trees: Preorder • Preorder Traversal Algorithm preOrder(v) “visit” node v for each child wof vdo recursively perform preOrder(w) • Example: reading a document from beginning to end

  12. Traversing Trees: Postorder • Postorder Traversal AlgorithmpostOrder(v) for each child wof vdo recursively perform postOrder(w) “visit” node v • Example: du(disk usage) command in Unix

  13. Traversing Trees • Algorithm evaluateExpression(v) if v is an external node return the variable stored at v else let o be the operator stored at v x evaluateExpression(leftChild(v)) y evaluateExpression(rightChild(v)) return x o y

  14. Traversing Trees: Inorder • Inorder traversal of a binary tree Algorithm inOrder(v) recursively perform inOrder(leftChild(v)) “visit” node v recursively perform inOrder(rightChild(v)) • Example: printing an arithmetic expression • print “(“ before traversing the left subtree • print “)” after traversing the right subtree

  15. The BinaryNode in Java • A tree is a collection of nodes: class BinaryNode <T> { T element; /* Item stored in node */ BinaryNode<T> left; BinaryNode<T> right; } • The tree stores a reference to the root node, which is the starting point. public class BinaryTree <T> { private BinaryNode<T> root; // Root node public BinaryTree() // Default constructor { root = null; } }

  16. HR+1 HL+1 HR HL Think Recursively • Computing the height of a tree is complex without recursion. • The height of a tree is one more than the maximum of the heights of the subtrees. • HT = max (HL+1, HR+1)

  17. Routine to Compute Height • Handle base case (empty tree) • Use previous observation for recursive case. public static int height (BinaryNode t) { if (t == null) return 0; else return 1 + max(height (t.left), height (t.right)); }

  18. Running Time • This strategy is a postorder traversal: information for a tree node is computed after the information for its children is computed. • The running time of tree traversal is N times the cost of processing each node. • Thus, the running time is linear because we do constant work for each node in the tree.

  19. Print Preorder class BinaryNode { void printPreOrder( ) { System.out.println( element ); // Node if( left != null ) left.printPreOrder( ); // Left if( right != null ) right.printPreOrder( ); // Right } } class BinaryTree { public void printPreOrder( ) { if( root != null ) root.printPreOrder( ); } }

  20. Print Postorder class BinaryNode { void printPostOrder( ) { if( left != null ) left.printPostOrder( ); // Left if( right != null ) right.printPostOrder( ); // Right System.out.println( element ); // Node } } class BinaryTree { public void printPostOrder( ) { if( root != null ) root.printPostOrder( ); } }

  21. Print Inorder class BinaryNode { void printInOrder( ) { if( left != null ) left.printInOrder( ); // Left System.out.println( element ); // Node if( right != null ) right.printInOrder( ); // Right } } class BinaryTree { public void printInOrder( ) { if( root != null ) root.printInOrder( ); } }

  22. Traversing Tree Pre-Order Post-Order InOrder

  23. Exercise • A tree contains Integer objects. • Find the maximum value • Find the total value

  24. Tree Iterator Class • Can we implement traversal non-recursively? • Recursion is implemented by using a stack. • We can traverse non-recursively by maintaining the stack ourselves (emulate stack of activation records). • Is a non-recursive approach faster than recursive approach? • Possibly:we can place only the essentials, while the compiler places an entire activation record.

  25. Postorder Traversal using Stack • Use stack to store the current state (nodes we have traversed but not yet completed) • Similar to PC (program counter) in the activation record • We “pop” each node three times, when: 0. about to make a recursive call to left subtree 1. about to make a recursive call to right subtree 2. about to process the current node itself

  26. Postorder Algorithm • init: push root onto stack with state 0 • advance: • while (true) • node X = pop from the stack • switch (state X): • case 0: • push node X with state 1 • push left child of X (if it exists) with state 0 • case 1: • push node X with state 2 • push right child of X (if it exists) with state 0 • case 2: • visit/process node X

  27. Postorder Traversal: Stack States

  28. Exercise • Create a non-recursive algorithm for inorder traversal using stack. • Create a non-recursive algorithm for preordertraversal using stack.

  29. Inorder Traversal using Stack • What are the states for inorder traversal? 0. about to make a recursive call to left subtree 1. about to process the current node 2. about to make a recursive call to right subtree

  30. Inorder Algorithm • init: push root onto the stack with state 0 • advance: • while (true) • node X = pop from the stack • switch (state X): • case 0: • push node X with state 1 • push left child of X (if it exists) with state 0 • case 1: • push node X with state 2 • visit/process node X • case 2: • push right child of X (if it exists) with state 0

  31. Inorder Algorithm (improved) • init: push root onto the stack with state 0 • advance (optimize): • while (true) • node X = pop from the stack • switch (state X): • case 0: • push node X with state 1 • push left child of X (if it exists) with state 0 • case 1: • visit/process node X • push right child of X (if it exists) with state 0

  32. Preorder Traversal using Stack • What are the states for preorder traversal? 0. about to process the current node 1. about to make a recursive call to left subtree 2. about to make a recursive call to right subtree

  33. Preorder Algorithm • init: push root onto the stack with state 0 • advance: • while (true) • node X = pop from the stack • switch (state X): • case 0: • push node X with state 1 • visit/process the node X • case 1: • push node X with state 2 • push left child of X (if it exists) with state 0 • case 2: • push right child of X (if it exists) with state 0

  34. Preorder Algorithm (improved) • init: push root onto the stack • advance (optimized): • while (true) • node X = pop from the stack • visit/process node X • push right child of X (if it exists) • push left child of X (if it exists)

  35. Euler Tour Traversal • Generic traversal of a binary tree • The preorder, inorder, and postorder traversals are special cases of the Euler tour traversal • “walk around” the tree and visit each node three times: • on the left • from below • on the right

  36. Level-Order Traversal • Visit root followed by its children from left to right and followed by their children. So we go down the tree level by level. • Sequence: A - B - C - D - E - F - G - H - I

  37. Level-Order Traversal: Idea • Using a queue instead of a stack • Algorithm (similar to pre-order) • init: enqueue the root into the queue • while(true): • node X = dequeue from the queue • visit/process node X; • enqueue left child of node X (if it exists); • enqueue right child of node X (if it exists);

  38. Binary Tree: Properties • Maximum number of nodes in a binary tree of height k is 2k+1 -1. • A full binary tree with height k is a binary tree which has 2k+1 - 1 nodes. • A complete binary tree with height k is a binary tree which has maximum number of nodes possible in levels 0 through k -1, and in (k -1)’th level all nodes with children are selected from left to right. • Complete binary tree with n nodes can be shown by using an array, then for any node with index i, we have: • Parent (i) is at i/2 if i 1; for i =1, we have no parent. • Left-child (i ) is at 2i if 2i  n. (else no left-child) • Right-child (i ) is at 2i+1 if 2i +1  n (else no right-child)

  39. Summary • Tree, Binary Tree • In order to process the elements of a tree, we consider accessing the elements in certain order • Tree traversal is a tree operation that involves "visiting” (or" processing") all the nodes in a tree. • Depth First Search (DFS): • Pre-order: Visit node first, pre-order all its subtrees from leftmost to rightmost. • Inorder: Inorder the node in left subtree and then visit the root following by inorder traversal of all its right subtrees. • Post-order: Post-order the node in left subtree and then post-order the right subtrees followed by visit to the node. • Breadth First Search (BFS): • Level-order: Visit root followed by its children from left to right and followed by their children. So we go down the tree level by level.

More Related