Anda di halaman 1dari 32

Trees

CPE311: DATA STRUCTURE AND


ALGORITHM ANALYSIS

What is a Tree?
A tree can be defined in several ways.
One natural definition of a tree is recursively.
A tree is a collection of nodes.

Collection of Nodes
The collection can be empty; otherwise, a tree consists of
distinguished node, r, called the root, and zero or more
non-empty (sub) trees T1, T2, , Tk, each of whose roots
are connected by a directed edge from r.
The root of each subtree is said to be a child of r, and r is
the parent of each subtree root.

ROOT

TK
T1

T2

T3

Generic Tree

T4

Recursive Definition
A tree is a collection of N nodes, one of which is the root.
Edges: N 1
Each edge connects some node to its parent, and every node
except the root has one parent.

A
G

B
C

K
P

A tree

A
G

B
C

K
P

A Node E has A as a parent and K, P, L, as children. Each node


any contain an arbitrary number of children, possibly zero.

A
G

B
C

K
P

A tree with no children are known as leaves.

A
G

B
C

K
P

Nodes with same parent are siblings.


Grandparent and grandchild relations can be defined in a similar
manner.

Preliminaries
A path from node n1 to nk is defined as a sequence of nodes.
ni is the parent of ni+1for 1 i k.
The length of this path is the number of edges on the path.
There is a path length of zero from every node to itself.

For any node ni, the depth of ni, is the length of the unique path
from the root to ni.
Thus, the root is at depth 0.

The height of ni, is the length of the longest path from n i to a leaf.
Thus all leaves are height 0.

The height of a tree is equal to the height of the root.


Depth of Tree = Height of Tree

n1 to n2, then n1 is an ancestor of n2, and n2 is a descendant of n1.

Implementation of Trees
One way to implement a tree would be to have in each
node, beside its data, a link to each child of the node.
It is infeasible to make the children direct links in the
data.

Node declaration for trees.

First Child/Next Sibling representation of previous tree figure.

Binary Trees
A Binary Tree is a tree in which no node can have more
than two children.

Implementation of
Binary Trees

Direct links to children is possible because it has, at most,


two children.
Binary trees have many important uses not associated with
searching. One of the principal uses of binary trees is in the
area of compiler design.

Expression Trees
The leaves are operands.
The other nodes contain operators.
This particular tree happens to be binary, because all the
operators are binary, and although this is the simplest
case, it is possible for nodes to have more than two
children.

+
*
+

*
b

c
*
d

Expression tree for (a + b * c) +((d * e + f) * g)

The Search Tree ADT


An important application of binary trees is their use in
searching.
We will talk about features that the ADT:
Contains
FindMin and findMax
Insert
Remove

Contains
This operation requires returning true if there is a node in
tree T that has item X, or false if there is no such node.
If T is empty, then we can just return false.
Otherwise, if the item stored at T is X, we can return true.

The structure of the tree makes this simple.

findMin and findMax


These private routines return a pointer to the node
containing the smallest and largest elements in the tree.
findMin
When performed, it starts at the root and go left as long as
there is a left child. The stopping point is the smallest
element.

findMax
When performed, it is the same except it branches to the
right child.

insert
The insertion routine is conceptually simple. To insert X
into tree T, proceed down the tree as you would with a
contains. If X is found, do nothing. Otherwise, insert X at
the last spot on the path traversed.

remove
As is common with many data structures, the hardest
operation is deletion. Once we have found the node to be
deleted, we need to consider several possibilities.
If the node is a leaf, it can be deleted immediately. If the
node has one child, the node can be deleted after its
parent adjusts a link to bypass the node

remove
The complicated case deals with a node with two
children. The general strategy is to replace the data of
this node with the smallest data of the right subtree
(which is easily found) and recursively delete that node
(which is now empty).

AVL Trees
An AVL (Adelson-Velskii and Landis) tree is a binary search
tree with a balance condition.
The balance condition must be easy to maintain, and it
ensures that the depth of the tree is O(logN).
The simplest idea is to require that the left and right
subtrees have the same height.

A bad binary tree. Requiring balance at the root is not


enough.

AVL Tree
An AVL tree is identical to a binary search tree, except
that for every node in the tree, the height of the left and
right subtrees can differ by at most 1.
(The height of an empty tree is defined to be 1.)

Let us call the node that must be rebalanced . Since any


node has at most two children, and a height imbalance
requires that s two subtrees heights differ by two, it is
easy to see that a violation might occur in four cases:
1. An insertion into the left subtree of the left child of
2. An insertion into the right subtree of the left child of
3. An insertion into the left subtree of the right child of
4. An insertion into the right subtree of the right child of

.These cases can be fixed by either:


1.Single Rotation
2.Double Rotation

Single Rotation

Single Rotation

Single Rotation

Single Rotation

Double Rotation

Double Rotation

Anda mungkin juga menyukai