Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree...
Transcript of Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree...
![Page 1: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/1.jpg)
Binary Trees
Chapter 12
![Page 2: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/2.jpg)
Fundamentals
• A binary tree is a nonlinear data
structure.
• A binary tree is either empty or it
contains a root node and left- and right-
subtrees that are also binary trees.
• Applications: encryption, databases,
expert systems
![Page 3: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/3.jpg)
Tree Terminology
A
GFED
CB
root
parent
left-child
right-child
siblings
leaf
left-subtree
right-subtree
![Page 4: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/4.jpg)
More Terminology
• Consider two nodes in a tree, X and Y.
• X is an ancestor of Y if
X is the parent of Y, or
X is the ancestor of the parent of Y.
It’s RECURSIVE!
• Y is a descendant of X if
Y is a child of X, or
Y is the descendant of a child of X.
![Page 5: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/5.jpg)
More Terminology
• Consider a node Y.
• The depth of a node Y is
0, if the Y is the root, or
1 + the depth of the parent of Y
• The depth of a tree is the maximum depth
of all its leaves.
![Page 6: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/6.jpg)
More Terminology
• A full binary tree is a binary tree such that - all leaves have the same depth, and- every non-leaf node has 2 children.
• A complete binary tree is a binary tree such that
- every level of the tree has themaximum number of nodes possibleexcept possibly the deepest level.
- at the deepest level, the nodes are as far left as possible.
![Page 7: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/7.jpg)
Tree Examples
A
GFED
CB
A
ED
B C
A full binary tree is always a complete binary tree.
A
B B
AA
1 2 3 4 5
What is the number of nodes in a full binary tree?
![Page 8: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/8.jpg)
Tree Traversals• preorder traversal
1. Visit the root.
2. Perform a preorder traversal of the left subtree.
3. Perform a preorder traversal of the right subtree.
• inorder traversal
1. Perform an inorder traversal of the left subtree.
2. Visit the root.
3. Perform an inorder traversal of the right subtree.
• postorder traversal
1. Perform a postorder traversal of the left subtree.
2. Perform a postorder traversal of the right subtree.
3. Visit the root.
![Page 9: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/9.jpg)
Traversal Example
A
GFED
CB
preorder
inorder
postorder
A B D E C F G
D B E A F C G
D E B F G C A
![Page 10: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/10.jpg)
Traversal Example
A
G
ED
CBpreorder
inorder
postorder
F H
I
ABDFGCEHI
BFDGAEIHC
FGDBIHECA
![Page 11: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/11.jpg)
Traversal Example(expression tree)
*
DCBA
/+
preorder
inorder
postorder
*+AB/CD
A+B*C/D
AB+CD/*
![Page 12: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/12.jpg)
A
CB
A
C
B
A
B
C
Preorder: ABC
More Examples
![Page 13: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/13.jpg)
Implementing a binary tree
• Use an array to store the nodes.
- mainly useful for complete binary trees
(next week)
• Use a variant of a singly-linked list where
each data element is stored in a node with
links to the left and right children of that
node
• Instead of a head reference, we will use a
root reference to the root node of the tree.
![Page 14: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/14.jpg)
A
B C
D E F G
H K
Conceptual Picture
![Page 15: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/15.jpg)
Binary Tree Node (BTNode)
public class BTNode {
private int data;
private BTNode left;
private BTNode right;
// BTNode methods
}
![Page 16: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/16.jpg)
BTNode methodspublic BTNode(int initData) {
data = initData;
left = null;
right = null;
}
public int getData()
public void setData(int newData)
public BTNode getLeft()
public void setLeft(BTNode newLeft)
public BTNode getRight()
public void setRight(BTNode newRight)
![Page 17: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/17.jpg)
BTNode methods (cont’d)
public void inorder()
{
if (left != null)
left.inorder();
System.out.println(data);
if (right != null)
right.inorder();
}
![Page 18: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/18.jpg)
BTNode methods (cont’d)
public void preorder()
{
System.out.println(data);
if (left != null)
left.preorder();
if (right != null)
right.preorder();
}
![Page 19: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/19.jpg)
BTNode methods (cont’d)public void traverse()
{
//preorder
if (left != null)
left.traverse();
//inorder
if (right != null)
right.traverse();
//postorder
}
![Page 20: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/20.jpg)
Which traversal is more appropriate?
• Evaluating an expression tree.
• Add all numbers in a tree.
• Find the maximum element of a tree.
• Print a tree rotated 90 degrees(in a counter clockwise fashion).
• Find the depth of a tree.
• Set the data field of each node to its depth.
![Page 21: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/21.jpg)
A Binary Tree Class
• We will implement a specific type of binary tree: a binary search tree.
• A binary search tree (BST) is a binary tree such that
- all the nodes in the left subtree areless than the root
- all the nodes in the right subtree are greater than the root
- the subtrees are BSTs as well
![Page 22: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/22.jpg)
BinarySearchTree class
public class BinarySearchTree {
private BTNode root;
public BinarySearchTree() {
root = null;
}
public boolean isEmpty() {
return (root == null);
}
![Page 23: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/23.jpg)
BinarySearchTree class (cont’d)
public void inorder() {
if (root != null)
root.inorder();
}
// other BinarySearchTree methods
}
This is a call to inorder()
from the BTNode class!
This is not a recursive call!
![Page 24: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/24.jpg)
Inserting into a BST
45
21 83
11 39 62 96
45 21 39 83 62 96 11
![Page 25: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/25.jpg)
Inserting into a BST
62 96 11 39 21 83 45
62
11 96
39 83
21 45
![Page 26: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/26.jpg)
Insert into BST
public void insert(int item) {
BTNode newNode;
BTNode cursor;
boolean done = false;
if (root == null) {
newNode = new BTNode(item);
root = newNode;
}
![Page 27: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/27.jpg)
Insert into BST (cont’d)
else {
cursor = root;
while (!done) {
if (item < cursor.getData()) {
if (cursor.getLeft() == null) {
newNode = new BTNode(item);
cursor.setLeft(newNode);
done = true;
}
else cursor = cursor.getLeft();
}
![Page 28: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/28.jpg)
Insert into BST (cont’d)else if (item > cursor.getData()) {
if (cursor.getRight() == null) {
newNode = new BTNode(item);
cursor.setRight(newNode);
done = true;
}
else cursor = cursor.getRight();
}
else done = true; // Why?
} // end while
}
}
![Page 29: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/29.jpg)
Traversing the BST
45 21 11 39 83 62 96
11 39 21 62 96 83 45
11 21 39 45 62 83 96
preorder
postorder
inorder
45
21 83
11 39 62 96
An inorder traversal
on a BST sorts the
numbers!
![Page 30: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/30.jpg)
Efficiency of “insert”
• For a full binary tree with N nodes, what is its depth d?
N = 20 + 21 + 22 + ... + 2d
= 2d+1 – 1
Thus, d = log2(N+1) – 1.
• An insert will take O(log N) time on a fullBST since we have to examine one node at each level before we find the insert point, and there are d levels.
![Page 31: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/31.jpg)
Efficiency of “insert” (cont’d)
• Are all BSTs full?
NO!
Insert the following numbers in order
into a BST: 11 21 39 45 62 83 96
What do you get?
• An insert will take O(N) time on an
arbitrary BST since there may be up to
N levels in such a tree.
![Page 32: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/32.jpg)
Removing from a BST
General idea:
• Start at the root and search for the item to remove by progressing one level at a time until either:
- the item is found
- we reach a leaf and the item is not found
• If the item is found, remove the node and repair the tree so it is still a BST.
![Page 33: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/33.jpg)
Removing from a BST
public boolean remove(int item) {
BTNode cursor = root;
BTNode parentOfCursor = null;
while (cursor != null &&
cursor.getData() != item) {
parentOfCursor = cursor;
if (item < cursor.getData())
cursor = cursor.getLeft();
else cursor = cursor.getRight();
}
![Page 34: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/34.jpg)
45
21 83
11 39 62 96
cursor
parentOfCursor = null
cursor
parentOfCursor
parentOfCursor
cursor = null
cursor
parentOfCursor
Case 1:
item not in tree
(e.g. item = 74)
Removing from a BST (cont’d)
if (cursor == null)
return false;
![Page 35: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/35.jpg)
Removing from a BST (cont’d)
else {
if (cursor == root &&
cursor.getLeft() == null) {
root = root.getRight();
}
45
83
62 96
Case 2:
item is root and
root has no left child
(e.g. item=45)
cursor
root
root
![Page 36: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/36.jpg)
Removing from a BST (cont’d)
else if (cursor != root &&
cursor.getLeft() == null) {
if (cursor == parentOfCursor.getLeft())
parentOfCursor.setLeft
(cursor.getRight());
45
22
31
Case 3(a):
item is in a non-root
node without a left child
cursor
parentOfCursor
X
![Page 37: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/37.jpg)
Removing from a BST (cont’d)
else
parentOfCursor.setRight
(cursor.getRight());
}
45
67
91
Case 3 (b):
item is in a non-root
node without a left child
cursor
parentOfCursor
X
![Page 38: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/38.jpg)
Removing from a BST (cont’d)
Case 4:
item is in a non-root
node but node has
a left child
45
21 83
11 39 62 96
cursor
Find the largest value in the left subtree of cursor
and move it to the cursor position.
This value is the “rightmost” node in the left subtree.
![Page 39: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/39.jpg)
Removing from a BST (cont’d)
Case 4 (cont’d):
item is in a non-root
node but node has
a left child
45
21 83
11 39 62 96
cursor
rightmostThen remove the rightmost
node (be careful: it might
have a left subtree!)
Copy the rightmost
data into the cursor
node.
39
![Page 40: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/40.jpg)
Removing from a BST (cont’d)
else {
cursor.setData(
cursor.getLeft()
.getRightmostData());
cursor.setLeft(
cursor.getLeft()
.removeRightmost());
}
return true;
}
}
![Page 41: Binary Trees - cs.stonybrook.educse214/lecture_slides/unit6.pdf · Fundamentals • A binary tree is a nonlinear data structure. • A binary tree is either empty or it contains a](https://reader030.fdocuments.in/reader030/viewer/2022040418/5d648bb088c99358458b5458/html5/thumbnails/41.jpg)
Additional BTNode methodspublic int getRightmostData() {
if (right == null) return data;
else return right.getRightmostData();
}
public BTNode removeRightmost() {
if (right == null) return left;
else {
right = right.removeRightmost();
return this;
}
}
Order of complexity for BST removal?