Binary Trees Parts of a binary tree n
Binary Trees
Parts of a binary tree n n A binary tree is composed of zero or more nodes Each node contains: n n n A binary tree may be empty (contain no nodes) If not empty, a binary tree has a root node n n A value (some sort of data item) A reference or pointer to a left child (may be null), and A reference or pointer to a right child (may be null) Every node in the binary tree is reachable from the root node by a unique path A node with neither a left child nor a right child is called a leaf n In some binary trees, only the leaves contain a value 2
Picture of a binary tree a b d g c e h f i j k l 3
Size and depth n a b d The size of a binary tree is the number of nodes in it n c n e f The depth of a node is its distance from the root n g h i j k n n l This tree has size 12 is at depth zero e is at depth 2 a The depth of a binary tree is the depth of its deepest node n This tree has depth 4 4
Balance a a b d c e f b c g h i j A balanced binary tree d e f g h i j An unbalanced binary tree n n A binary tree is balanced if every level above the lowest is “full” (contains 2 n nodes) In most applications, a reasonably balanced binary tree is desirable 5
Binary search in a sorted array n Look at array location (lo + hi)/2 Searching for 5: (0+6)/2 = 3 hi = 2; (0 + 2)/2 = 1 Using a binary search tree lo = 2; (2+2)/2=2 4 5 7 0 1 2 3 5 7 11 13 17 3 6 2 13 5 11 17 6
Tree traversals n n A binary tree is defined recursively: it consists of a root, a left subtree, and a right subtree To traverse (or walk) the binary tree is to visit each node in the binary tree exactly once Tree traversals are naturally recursive Since a binary tree has three “parts, ” there are six possible ways to traverse the binary tree: n root, right, left n root, left, right n right, root, left n left, root, right n right, left, root n left, right, root 7
Preorder traversal n n In preorder, the root is visited first Here’s a preorder traversal to print out all the elements in the binary tree: public void preorder. Print(Binary. Tree bt) { if (bt == null) return; System. out. println(bt. value); preorder. Print(bt. left. Child); preorder. Print(bt. right. Child); } 8
Inorder traversal n n In inorder, the root is visited in the middle Here’s an inorder traversal to print out all the elements in the binary tree: public void inorder. Print(Binary. Tree bt) { if (bt == null) return; inorder. Print(bt. left. Child); System. out. println(bt. value); inorder. Print(bt. right. Child); } 9
Postorder traversal n n In postorder, the root is visited last Here’s a postorder traversal to print out all the elements in the binary tree: public void postorder. Print(Binary. Tree bt) { if (bt == null) return; postorder. Print(bt. left. Child); postorder. Print(bt. right. Child); System. out. println(bt. value); } 10
Tree traversals using “flags” n The order in which the nodes are visited during a tree traversal can be easily determined by imagining there is a “flag” attached to each node, as follows: preorder n inorder postorder To traverse the tree, collect the flags: A B D C E A A F ABDECFG B G D B C E F DBEAFCG G D C E F G DEBFGCA 11
Copying a binary tree n n In postorder, the root is visited last Here’s a postorder traversal to make a complete copy of a given binary tree: public Binary. Tree copy. Tree(Binary. Tree bt) { if (bt == null) return null; Binary. Tree left = copy. Tree(bt. left. Child); Binary. Tree right = copy. Tree(bt. right. Child); return new Binary. Tree(bt. value, left, right); } 12
Other traversals n The other traversals are the reverse of these three standard ones n n That is, the right subtree is traversed before the left subtree is traversed Reverse preorder: root, right subtree, left subtree Reverse inorder: right subtree, root, left subtree Reverse postorder: right subtree, left subtree, root 13
The End 14
- Slides: 14