160 likes | 315 Vues
This guide provides a comprehensive overview of binary trees, a foundational data structure in computer science. It covers the recursive definition of trees, different types of tree nodes, creating a binary tree, tree traversal methods (preorder, inorder, and postorder), and essential memory management practices such as node allocation and deallocation. Visual examples clarify how each traversal method works, along with sample outputs. Ideal for students and professionals seeking to deepen their understanding of binary trees in programming and algorithms.
E N D
Trees in C CSE 2541 Matt Boggus
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: 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/