Trees
Trees
Trees
Lecture 09: Trees Data Structures
Trees
Lecture 09: Trees Data Structures
Parts of a Tree
Hierarchical data structure
Each position in the tree is called a node
nodes
Lecture 09: Trees Data Structures
Parts of a Tree
•The “top” of the tree is called the root or Parent node
Parent/Root
node
Lecture 09: Trees Data Structures
Parts of a Tree
The nodes immediately below a node are called its children
parent child
node nodes
5
Lecture 09: Trees Data Structures
Parts of a Tree
parent child
node nodes
Lecture 09: Trees Data Structures
Parts of a Tree
nodes with no children are called leaves (or terminal nodes), or terminal nodes
leaf
root node
nodes
Lecture 09: Trees Data Structures
y C
Lecture 09: Trees Data Structures
Trees Traversal
B C
Lecture 09: Trees Data Structures
Parts of a Tree
A node plus the collection of nodes beneath it is called a subtree
sub-tree
10
Lecture 09: Trees Data Structures
Parts of a Tree
A node plus the collection of nodes beneath it is called a subtree
sub-tree
Lecture 09: Trees Data Structures
Depth/Height of A Node
The number of nodes in the longest path from the root to a leaf
is the depth (or height) of the tree
nodes Depth 0
Depth 1
Depth 2
Depth 3
Lecture 09: Trees Data Structures
Depth/Height of A Node
The number of nodes in the longest path from the root to a leaf
is the depth (or height) of the tree
nodes Height 3
Height 2
Height 1
Height 0
Lecture 09: Trees Data Structures
Binary Trees
Binary Tree
A commonly used type of tree is a binary tree
Each node has at most two children
nodes
Lecture 09: Trees Data Structures
nodes
Lecture 09: Trees Data Structures
Binary trees
• A tree is called strictly binary tree if every non leaf node has exactly two
children.
• A strictly binary tree having n leaves always contain 2n-1 nodes
• Text book definition of depth of a tree
– Depth of binary tree is maximum level of any leaf in the tree.
– Root of tree is at level 0, and level of any other node in the tree is one more than
the level of its father
Lecture 09: Trees Data Structures
Binary Trees
• A complete binary tree of level d is the strictly binary tree all of whose
leaves are at level d
• A complete binary tree of level d has 2l nodes at each level l where
0<=l<=d
• Total number of nodes (tn) in a complete binary tree of depth d will
be:
d
tn 2 0 21 2 2 2 d 2 j 2 d 1 1
j 0
Binary Trees
• For a complete binary tree if number of nodes (tn) are known, then we may
find depth of the binary tree
d 1
tn 2 1
d 1
2 tn 1
d 1 log 2 (tn 1)
d log 2 (tn 1) - 1
A binary tree with nodes n has height O(log2n)
Lecture 09: Trees Data Structures
Traversal
• Systematic way of visiting all the nodes.
• Methods:
– Preorder, Inorder, and Postorder
• They all traverse the left subtree before the right subtree.
Trees Traversal
• Inorder
Root
– (Left) Root (Right)
• Preorder
– Root (Left) (Right) Left Right
• Postorder
– (Left) (Right) Root
Lecture 09: Trees Data Structures
Pre-Order Traversal
Preorder Traversal
Root Left Right manner
• + Left Right +
C D
Lecture 09: Trees Data Structures
Example: Pre-Order
43
31 64
20 40 56 89
28 33 47 59
43 31 20 28 40 33 64 56 47 59 89
Lecture 09: Trees Data Structures
In-Order Traversal
Inorder Traversal
Left Root Right manner
+
• Left + Right
* +
• [Left*Right]+[Left+Right]
• (A*B)+[(Left*Right)+E) A B * E
• (A*B)+[(C*D)+E]
C D
(A*B)+(C*D+E)
Lecture 09: Trees Data Structures
Example: In-Order
43
31 64
20 40 56 89
28 33 47 59
20 28 31 33 40 43 47 56 59 64 89
Lecture 09: Trees Data Structures
Post-Order Traersal
Postorder Traversal
Left Right Root manner
+
• Left Right +
* +
• [Left Right *] [Left Right+] +
• (AB*) [Left Right * E + ]+ A B * E
• (AB*) [C D * E + ]+
• AB* C D * E + +
C D
Lecture 09: Trees Data Structures
Example: Post-Order
43
31 64
20 40 56 89
28 33 47 59
28 20 33 40 31 47 59 56 89 64 43
Lecture 09: Trees Data Structures
• Each successive level in the tree stored left to right; unused nodes in tree
represented by a bit pattern to indicate nothing stored there
• Children of any given node n is stored in cells 2n and 2n + 1 (If array index
starts at 1)
Array Representation
• Arrays are very easily used to represent complete binary trees
• Example
L G
O R I T
H M S
Lecture 09: Trees Data Structures
Array Representation
1
2
3
4 5
6 7
8 9 10 11 12 13
class CBinTree
{
struct Node
{
int value;
Node *LeftChild,*RightChild;
}*Root;
/***Operations*********/
/************************/
};
Lecture 09: Trees Data Structures
ROOT
Lecture 09: Trees Data Structures
Binary Trees
Primitive Operations
• Left(node): Gives index/pointer of left child
• Right(node): Gives index/pointer of right child
• Parent(node): Returns index/pointer of parent
• Brother(node): Returns index/pointer of brother
• Root: Gives index/pointer of root node
• Info(Node): Data/Info stored at node
• IsLeft(node): Is node left child? Yes/No
• IsRight(node): Is node right child? Yes/No
Lecture 09: Trees Data Structures
Expression Trees
• Expression tree for:
(a+b*c) +((d*e+f)*g)
•Inorder traversal
•Preorder traversal
•Postorder traversal
Lecture 09: Trees Data Structures
X
Lecture 09: Trees Data Structures
Binary Search Tree Operations
There are many operations one can perform on a binary search tree.
The basic node of our binary tree has the following struct declaration.
struct TreeNode
{
int value;
TreeNode *left;
TreeNode *right;
}
The root pointer is the pointer to the binary tree. This is similar
to the head pointer in a linked list.
The root pointer will point to the first node in the tree, or to NULL
(if the tree is empty).
Inserting a Node
#include <iostream.h>
#include "IntBinaryTree.h“
void main(void)
{
IntBinaryTree tree;
Figure shows the structure of the binary tree built by the program.
void showNodesInOrder(void)
{ displayInOrder(root); }
void showNodesPreOrder()
{ displayPreOrder(root); }
void showNodesPostOrder()
{ displayPostOrder(root); }
Program
void main(void)
{
IntBinaryTree tree;
Program Output
Inserting nodes.
Inorder traversal:
3
5
8
9
12
Lecture 09: Trees Data Structures
Preorder traversal:
5
3
8
12
9
Postorder traversal:
3
9
12
8
5
The function starts at the root node, and traverses the tree, until it
finds the search value, or runs out of nodes.
bool IntBinaryTree::searchNode(int num)
{
TreeNode *nodePtr = root;
while (nodePtr)
{
if (nodePtr->value == num)
return true;
else if (num < nodePtr->value)
nodePtr = nodePtr->left;
else
nodePtr = nodePtr->right;
}
return false;
}
Lecture 09: Trees Data Structures
Program
void main(void)
{
IntBinaryTree tree;
Program Output
Inserting nodes.
3 is found in the tree.
Deleting a Node
We want to delete the node, but preserve the sub-trees, that the
node links to.
The problem is not as easily solved if the node has two children.
Lecture 09: Trees Data Structures
One solution is to -
a) find a position in the right subtree to attach the left subtree.
b) attach the node’s right subtree to the parent
Lecture 09: Trees Data Structures
Now the code - to delete a node from the IntBinaryTree, call the
public member remove. The argument passed to the function is the
value of the node you want to delete.
Lecture 09: Trees Data Structures
The above statement compares the parameter num with the value
member of the node that nodePtr point to.
If num is less, the value being searched for will appear somewhere
in the nodePtr’s left subtree (if it appears at all).
So, nodePtr points to the node to be deleted, and the trailing else will
be executed.
else
makeDeletion(nodePtr);
The makeDeletion function actually deletes the node from the tree
and reattaches the deleted node’s sub trees.
Lecture 09: Trees Data Structures
It must have access to the actual pointer in the tree to the node that
is being deleted (not just a copy of the pointer).
if (nodePtr == NULL)
cout << "Cannot delete empty node.\n";
else if (nodePtr->right == NULL)
{
tempNodePtr = nodePtr;
nodePtr = nodePtr->left; // Reattach the left child
delete tempNodePtr;
}
Lecture 09: Trees Data Structures
else if (nodePtr->left == NULL)
{
tempNodePtr = nodePtr;
nodePtr = nodePtr->right; // Reattach the right child
delete tempNodePtr;
}
// If the node has two children.
else
{
// Move one node the right.
tempNodePtr = nodePtr->right;
// Go to the end left node.
while (tempNodePtr->left)
tempNodePtr = tempNodePtr->left;
// Reattach the left subtree.
tempNodePtr->left = nodePtr->left;
tempNodePtr = nodePtr;
// Reattach the right subtree.
nodePtr = nodePtr->right;
delete tempNodePtr;
}
}
Lecture 09: Trees Data Structures
Program
void main(void)
{
IntBinaryTree tree;
Program Output
Inserting nodes.
Here are the values in the tree:
3
5
8
9
12
Deleting 8...
Deleting 12...
Now, here are the nodes:
3
5
9