170 likes | 273 Views
Trees in C. CSE 2541 Rong Shi. Tree definition. Recursively defined data structure Tree (in general) Empty Data + a specific number of subtrees Binary tree Empty Data + left subtree + right subtree. C Binary Tree node.
E N D
Trees in C CSE 2541 Rong Shi
Tree definition • Recursively defined data structure • Tree (in general) • Empty • Data + a specific number of subtrees • Binary tree • Empty • Data + left subtree + right subtree
C Binary Tree node structbtnode{ int data; structbtnode *left; structbtnode*right; } ;
What is this? structtreenode{ int data; structtreenode *mynode; } ; Equivalent to a linked list
Creating a tree structbtnode *root; structbtnode *mynode= (structbtnode *) malloc (sizeof(structbtnode)); root = mynode; // use root to access the tree, like head for a linked list
Visual example of a binary tree Each value corresponds to a node in the tree root is a structbtnode pointer that points at the node containing the 9
Tree traversal (preorder) PreOrderPrint(structbtnode*anode) { printf(“%i”, anode->data); PreOrderPrint(anode->left); PreOrderPrint(anode->right); } Any problems with this function?
Tree traversal (preorder corrected) PreOrderPrint(structbtnode*anode) { if(anode == NULL) return; printf(“%i ”, anode->data); PreOrderPrint(anode->left); PreOrderPrint(anode->right); } Output of PreOrderPrint(root) is: (po9pt9po6pt6… see blackboard) 9 6 2 7 15 12 25
Tree traversal (inorder) InOrderPrint(structbtnode*anode) { if(anode == NULL) return; InOrderPrint(anode->left); printf(“%i ”, anode->data); InOrderPrint(anode->right); } Output of InOrderPrint(root) is: 2 6 7 9 12 15 25
Tree traversal (postorder) PostOrderPrint(structbtnode*anode) { if(anode == NULL) return; PostOrderPrint(anode->left); PostOrderPrint(anode->right); printf(“%i ”, anode->data); } Output of PostOrderPrint(root) is: 2 7 6 12 25 15 9
Tree termination • NULL pointers NULL are not btnodes, but the value of their parent’s left and right pointers • NULL data -1 are btnodes, whose left and right btnodes are uninitialized Assumption: -1 is never valid data in the tree
Creating nodes structnode * NewNode(int data) { struct node *mynode= (struct node *) malloc (sizeof(struct node)); mynode->data = data;mynode->left = NULL;mynode->right = NULL; return(node); }
Deallocating binary trees • Three things to do • Free current node • Recursively free left subtree • Recursively free right subtree • What is the order? void delete_tree(structbtnode*leaf) { if( leaf != NULL ) { delete_tree(leaf->left); delete_tree(leaf->right); free( leaf ); } }
Trees and arrays Map current node, left child, and right child to array positions Order in the array by level in the tree Figure from http://scientopia.org/blogs/goodmath/2008/04/29/implementing-compact-binary-heaps/
Trees and arrays Map current node, left child, and right child to array positions t[i] , t[2i+1] , t[2i+2] Order in the array by level in the tree Figure from http://scientopia.org/blogs/goodmath/2008/04/29/implementing-compact-binary-heaps/
Additional Terminology • Depth: number of edges from the root to the node (node ‘7’ has depth 2, etc) • Height: number of edges from the node to the deepest leaf • Height of Tree: height of the root (tree-height = 2)
Reference • Wiki http://en.wikipedia.org/wiki/Binary_search_tree http://en.wikipedia.org/wiki/Tree_(data_structure) Slides from CMU http://www.cs.cmu.edu/~adamchik/15-121/lectures/Trees/trees.html