Download child

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Lattice model (finance) wikipedia , lookup

Quadtree wikipedia , lookup

B-tree wikipedia , lookup

Red–black tree wikipedia , lookup

Interval tree wikipedia , lookup

Binary search tree wikipedia , lookup

Binary tree wikipedia , lookup

Transcript
Data Structures
9th Week
Chapter 5 Trees
5.3 Binary Tree Traversals
5.4 Additional Binary Tree Operations
5.5 Threaded Binary Trees
Program5.2 이진 트리의 전위순회
void preorder(tree_pointer ptr)
/* 전위 트리 순회*/
{
if(ptr) {
printf(“%d”,ptr->data);
preorder(ptr->left_child);
preorder(ptr->right_child);
}
}
Program 5.3 이진 트리의 후위 순회
void postorder(tree_pointer ptr)
/* 후위 트리 순회*/
{
if(ptr){
postorder(ptr->left_child);
postorder(ptr->right_child);
printf(“%d”,ptr->data);
}
}
Iterative Inorder Traversal

To simulate the recursive, we must create our stack

In the previous figure, a node that has no action
indicates that the node is added to the stack, while a
node that has a print action indicates that the node is
removed from the stack

Analysis of inorder2
Let n be the number of nodes in the tree.
Since every node of the tree is placed on and removed from the stack
exactly once, the time complexity is O(n)
Ex) Iterative inorder traversal
void iter_inorder ( tree_pointer node )
{
int top = -1 ; /* initialize stack */
tree_pointer stack[MAX_STACK_SIZE];
for ( ; ; ) {
for ( ; node; node = node->left_child )
add (&top, node) ; /* add to stack */
node = delete ( &top ) ; /* delete from stack */
if ( !node ) break ; /*empty stack */
printf ( “%d”, node->data) ;
node = node->right_child ;
}
}
Ex)Level order traversal of a binary tree
Void level_order( tree_pointer ptr)
{ /* level order tree traversal */
int front = rear = 0 ;
tree_pointer queue[MAX_QUEUE_SIZE] ;
if ( !ptr ) return ; /* empty tree */
addq ( front, &rear, ptr ) ;
for ( ; ; ) {
ptr = deleteq (&front, rear) ;
if (ptr) {
printf (“%d”, ptr->data) ;
if ( ptr->left_child)
addq(front, &rear, ptr->left_child);
if ( ptr->fight_child)
addq ( front, &rear, ptr->right_child);
}
else break;
}
}
Other Binary Tree Operations

Copying Binary Trees

Testing for equality of binary trees

The satisfiability problem
Consider the set of formulas from variables x1, x2, ..., xn and operators
^, V and ~ The value of a variable is either TRUE or FALSE. The
expression is defined as :
(1) A variable is an expression
(2) If x and y are expressions, then ~x, x^y, x v y are expressions
(3) Parenthesis can be used to alter the normal order of evaluation,
which is ~ before ^ before v
(ex) E = x1 v (x2 ^ ~ x3)
If x1 and x3 are false and x2 is true, then E is true.
Ex) Copying a binary tree
tree_pointer copy ( tree_pointer original )
{
/*this function returns a tree_pointer to an exact copy
of the original tree */
tree_pointer temp;
if (original) {
temp = (tree_pointer ) malloc (sizeof(node));
if (IS_FULL(temp)) {
fprintf (stderr, “ The memory is full \n”);
exit(1) ;
}
temp->left_child = copy (original->left_child);
temp->right_child = copy (original->right_child);
temp->data = original->data ;
return temp;
}
return NULL;
Ex)Testing for equality of binary trees
int equal(tree_pointer first, tree_pointer second)
{
/* function returns FALSE if the binary trees first and
Second are not equal, otherwise it returns TRUE */
return ((!first && !second ) || (first && second &&
(first->data == second->data) &&
equal(first->left_child, second->left_child) &&
equal(first->right_child, second->right_child))
}
Threaded Binary Tree

n + 1 null links out of 2n total links
They replace the null links by pointers, called threads, to other nodes
in the tree

To construct the threads, use the following rules:
(1) If ptr -> left_child is null, replace ptr -> left_child with a pointer to
the inorder predecessor of ptr.
(2) If ptr -> right_child is null, replace ptr -> right_child with a pointer
to the inorder successor of ptr.
(Ex) Threaded tree
root
A
C
D
H
B
E
I
F
G
typedef struct threaded_tree *threaded_pointer;
typedef struct threaded_tree {
short int left_thread;
threaded_pointer left_child;
char data;
threaded_pointer right_child;
short int right_thread;
};

Suppose ptr is an arbitrary node in a tree.
If ptr->left_thread = TRUE, then ptr->left_child contains a
thread.
Otherwise, it contains a pointer to the left child.
right_thread is defined similarly.

Two dangling threads
left_child of leftmost leaf node and
right_child of rightmost leaf node
=> use a head node
left_thread left_child data right_child right_thread
TRUE
FALSE
An empty threaded tree
f
f
f
t
D
f
H
t
t
f
A
f
B
f
f
-
t
I
E
t
t
t
f
C
F
t
f
t
G
t

Inorder traversal of a threaded binary tree
For any node ptr, if ptr->right_thread = TRUE, the inorder successor of ptr
is ptr->right_child. Otherwise, it is the leftmost leaf node of ptr뭩 right
subtree.
We can find the inorder successor of any node in a threaded tree without
using a stack. To perform inorder tree traversal, we make repeated calls
to insucc

Inserting a node into a threaded binary tree as a right child
when its right subtree is empty
(1) change parent -> right-thread to FALSE
(2) set child -> left_thread and child -> right_thread to TRUE
(3) set child -> left_child to point to parent
(4) set child -> right_child to parent -> right_child
(5) change parent -> right_child to point to child
root
root
A
A
B
B
parent
C
parent
C
D
child
(a)
D
child
root
root
A
A
B
B
parent
parent
child
C
C
D
E
F
child
X
X
D
E
F
Ex)finding the inorder successor of a node
threaded_pointer insucc ( threaded_pointer tree )
{
/* find the inorder successor of tree in a treaded binary tree */
threaded_pointer temp ;
temp = tree->right_child ;
if ( !tree->right_thread )
while ( !temp->left_thread )
temp = temp->left_child ;
return temp ;
}
Ex)Inorder traversal of a threaded binary tree
void tinorder ( threaded_pointer tree)
{
/* traverse the threaded binary tree inorder */
threaded_pointer temp = tree;
for ( ; ; ) {
temp = insucc (temp) ;
if (temp = tree) break ;
printf (“%3c”, temp->data) ;
}
}
Ex)Right insertion in a threaded binary tree
void insert_right ( threaded_pointer parent, threaded_pointer child)
{
/* insert child as the right child of parent in a threaded binary tree*/
threaded_pointer temp ;
child->right_child = parent->right_child ;
child->right_thread = parent->right_thread ;
child->left_child = parent ;
child->left_thread = TRUE ;
parent->right_child = child ;
parent->right_thread = FALSE ;
if ( !child->right_thread ) {
temp = insucc(child) ;
temp->left_child = child ;
}
}