Upload
benedict-singleton
View
217
Download
0
Embed Size (px)
Citation preview
Trees in C
CSE 2541Rong 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
struct btnode { int data; struct btnode *left; struct btnode *right; } ;
What is this?
struct treenode { int data; struct treenode *mynode; } ;
Equivalent to a linked list
Creating a tree
struct btnode *root;struct btnode *mynode =
(struct btnode *) malloc (sizeof(struct btnode));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 treeroot is a struct btnode pointer that points at the node containing the 9
Tree traversal (preorder)
PreOrderPrint(struct btnode *anode){
printf(“%i”, anode->data);PreOrderPrint(anode->left);PreOrderPrint(anode->right);
}
Any problems with this function?
Tree traversal (preorder corrected)
PreOrderPrint(struct btnode *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(struct btnode *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(struct btnode *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 pointersNULL are notbtnodes, but thevalue of theirparent’s left andright pointers
• NULL data-1 are btnodes,whose left andright btnodes are uninitializedAssumption: -1 is nevervalid data in the tree
Creating nodes
struct node * 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(struct btnode *leaf) {
if( leaf != NULL ) {delete_tree(leaf->left); delete_tree(leaf->right);free( leaf );
} }
Trees and arrays
Figure from http://scientopia.org/blogs/goodmath/2008/04/29/implementing-compact-binary-heaps/
Map current node, left child, and right child to array positions
Order in the array by level in the tree
Trees and arrays
Figure from http://scientopia.org/blogs/goodmath/2008/04/29/implementing-compact-binary-heaps/
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
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• Wikihttp://en.wikipedia.org/wiki/Binary_search_treehttp://en.wikipedia.org/wiki/Tree_(data_structure)
Slides from CMUhttp://www.cs.cmu.edu/~adamchik/15-121/lectures/Trees/trees.html