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 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 tree root 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: (po9 pt9 po6 pt6… see blackboard)
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:
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:
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 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 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 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 Wiki Slides from CMU 121/lectures/Trees/trees.html