170 likes | 286 Vues
This guide provides a comprehensive overview of binary trees, including their definition, structure, and types. Key topics covered include recursive definitions, node structures, tree creation, and traversal methods such as pre-order, in-order, and post-order. Additionally, it discusses node deallocation and memory management best practices. Dive into how binary trees can be implemented and represented using linked lists, and explore the relationships between tree nodes and array representations. Useful for students and professionals encountering trees in computer science.
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