Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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 ; } }