Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Binary Trees and Binary Search Trees Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)

Similar presentations


Presentation on theme: "1 Binary Trees and Binary Search Trees Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)"— Presentation transcript:

1 1 Binary Trees and Binary Search Trees Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)

2 2 A binary tree is a structure in which: Each node can have at most two children, and in which a unique path exists from the root to every other node. The two children of a node are called the left child and the right child, if they exist. Binary Tree

3 3 A Binary Tree Q V T K S A E L

4 4 How many leaf nodes? Q V T K S A E L

5 5 How many descendants of Q? Q V T K S A E L

6 6 How many ancestors of K? Q V T K S A E L

7 7 A Binary Tree with Tree Nodes Q V T K S A E L

8 8 Node Terminology for a Tree Node

9 9 Binary Trees l You can write a class that represents each node in a binary tree Called BinaryTreeNode Instance variables of the class BinaryTreeNode info: stores the information part of the node lLink: points to the root node of the left subtree rLink: points to the root node of the right subtree

10 10 Tree Traversals l Insertion, deletion, and lookup (and other) operations require that the binary tree be traversed l Commonly used traversals n Inorder traversal n Preorder traversal n Postorder traversal

11 11 Tree Traversals: In Order Print

12 12 Inorder (tree): LeftNodeRight l Binary tree is traversed as follows: n Traverse left subtree n Visit node n Traverse right subtree private void inorder(BinaryTreeNode t){ if (t != null) { inorder(t.lLink); System.out.print(t.info + “ “); inorder(t.rLink); } To print in alphabetical order

13 13 Postorder (tree): LeftRightNode l Binary tree is traversed as follows: n Traverse left subtree n Traverse right subtree n Visit node private void postorder(BinaryTreeNode t){ if (t != null){ postorder(t.lLink); postorder(t.rLink); System.out.print(t.info + “ “); } Visits leaves first (good for deletion)

14 14 Preorder (tree): NodeLeftRight l Binary tree is traversed as follows: n Visit node n Traverse left subtree n Traverse right subtree private void preorder(BinaryTreeNode t){ if (t != null) { System.out.print(t.info + “ “); preorder(t.lLink); preorder(t.rLink); } Useful with binary trees (not BST)

15 15 Three Tree Traversals

16 16 Binary Search Trees (BST) l To search for an item in a normal binary tree, you must traverse entire tree until item is found n Search process will be very slow n Similar to searching in an arbitrary linked list l Binary search tree n Data in each node is –Larger than the data in its left child –Smaller than the data in its right child

17 17 A special kind of binary tree in which: 1. Each node contains a distinct data value, 2. The key values in the tree can be compared using “greater than” and “less than”, and 3. The key value of each node in the tree is less than every key value in its right subtree, and greater than every key value in its left subtree. So, a Binary Search Tree (BST) is...

18 18 Depends on its key values and their order of insertion. Insert the elements ‘J’ ‘E’ ‘F’ ‘T’ ‘A’ in that order. The first value to be inserted is put into the root node. The shape of a binary search tree... ‘J’

19 19 Thereafter, each value to be inserted begins by comparing itself to the value in the root node, moving left it is less, or moving right if it is greater. This continues at each level until it can be inserted as a new leaf. Inserting ‘E’ into the BST ‘J’ ‘E’

20 20 Begin by comparing ‘F’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf. Inserting ‘F’ into the BST ‘J’ ‘E’ ‘F’

21 21 Begin by comparing ‘T’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf. Inserting ‘T’ into the BST ‘J’ ‘E’ ‘F’ ‘T’

22 22 Begin by comparing ‘A’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf. Inserting ‘A’ into the BST ‘J’ ‘E’ ‘F’ ‘T’ ‘A’

23 23 is obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order? What binary search tree... ‘A’

24 24 obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order. Binary search tree... ‘A’ ‘E’ ‘F’ ‘J’ ‘T’

25 25 Another binary search tree Add nodes containing these values in this order: ‘D’ ‘B’ ‘L’ ‘Q’ ‘S’ ‘V’ ‘Z’ ‘J’ ‘E’ ‘A’ ‘H’ ‘T’ ‘M’ ‘K’ ‘P’

26 26 Is ‘F’ in the binary search tree? ‘J’ ‘E’ ‘A’ ‘H’ ‘T’ ‘M’ ‘K’ ‘V’ ‘P’ ‘Z’‘D’‘Q’‘L’‘B’‘S’

27 27 Tree Recursion Method countNodes (pseudocode): if tree is null return 0 else return countNodes(Left(tree)) + countNodes(Right(tree)) + 1

28 28 The Search Operation

29 29 The Search Operation public boolean search(T item) { return recSearch(root, item); } //helper: recursive method called by search public boolean recSearch(BinaryTreeNode tree, T item) { if(tree == null) return false; else { Comparable temp = (Comparable ) tree.info; if (temp.compareTo(item) == 0) return true; else if (temp.compareTo(item) > 0) return recSearch(tree.lLink, item); else return recSearch(tree.rLink, item); }

30 30 The Insert Operation l Important: A new node is always inserted into its appropriate position in the binary search tree as a leaf.

31 31 Insertions into a Binary Search Tree

32 32 The Insert Operation public void insert(T item) { root = recInsert(root, item); } //helper: recursive method called by insert public BinaryTreeNode recInsert(BinaryTreeNode tree, T item) { if(tree == null) { //create new node tree = new BinaryTreeNode (item); } else { Comparable temp = (Comparable ) tree.info; if (temp.compareTo(item) == 0) { System.err.print("Already in - no duplicates."); return null; } else if (temp.compareTo(item) > 0) tree.lLink = recInsert(tree.lLink, item); else tree.rLink = recInsert(tree.rLink, item); } return tree; }

33 33 The Delete Operation l The delete operation has 3 cases n Node to be deleted is a leaf n Node to be deleted has 1 child (left OR right) n Node to be deleted has 2 children (nonempty left and right subtrees)

34 34 Deleting a Leaf Node

35 35 Deleting a Node with One Child

36 36 Deleting a Node with Two Children (Q)

37 37 The Delete Operation Base Case: If item's key matches Info(tree), delete node General Case: If item < Info(tree), delete(Left(tree), item); else delete(Right(tree), item).

38 38 Code for Recursive Delete public void delete(T item) { root = recDelete(root, item); } //helper: recursive method called by delete public BinaryTreeNode recDelete(BinaryTreeNode tree, T item) { if(tree == null){ //empty tree System.err.println("Cannot delete from an empty tree."); return null; } else { Comparable temp = (Comparable ) tree.info; if (temp.compareTo(item) > 0) tree.lLink = recDelete(tree.lLink, item); else if(temp.compareTo(item) < 0) tree.rLink = recDelete(tree.rLink, item); else if(tree.lLink != null && tree.rLink != null) {// 2 children tree.info = findMin(tree.rLink).info; //tree.info = findMax(tree.lLink).info; tree.rLink = removeMin(tree.rLink); } else if(root.lLink != null) //1 left child tree = tree.lLink; else if(root.rLink != null) //1 right child tree = tree.rLink; return tree; }

39 39 Code for Recursive Delete //helper: method called by recDelete protected BinaryTreeNode findMin(BinaryTreeNode tree) { if(tree != null) while(tree.lLink != null) tree = tree.lLink; return tree; } //helper: method called by recDelete protected BinaryTreeNode removeMin(BinaryTreeNode tree) { if(tree == null){ //empty tree System.err.println("Cannot delete from an empty tree."); return null; } else if(tree.lLink != null) { tree.lLink = removeMin(tree.lLink); return tree; } else return tree.rLink; }


Download ppt "1 Binary Trees and Binary Search Trees Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)"

Similar presentations


Ads by Google