17
Trees in C CSE 2541 Rong Shi

Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

Embed Size (px)

Citation preview

Page 1: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

Trees in C

CSE 2541Rong Shi

Page 2: 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 definition

• Recursively defined data structure

• Tree (in general)– Empty– Data + a specific number of subtrees

• Binary tree– Empty– Data + left subtree + right subtree

Page 3: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

C Binary Tree node

struct btnode { int data; struct btnode *left; struct btnode *right; } ;

Page 4: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

What is this?

struct treenode { int data; struct treenode *mynode; } ;

Equivalent to a linked list

Page 5: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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

Page 6: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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

Page 7: 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 traversal (preorder)

PreOrderPrint(struct btnode *anode){

printf(“%i”, anode->data);PreOrderPrint(anode->left);PreOrderPrint(anode->right);

}

Any problems with this function?

Page 8: 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 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

Page 9: 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 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

Page 10: 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 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

Page 11: 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 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

Page 12: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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); }

Page 13: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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 );

} }

Page 14: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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

Page 15: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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

Page 16: Trees in C CSE 2541 Rong Shi. Tree definition Recursively defined data structure Tree (in general) – Empty – Data + a specific number of subtrees Binary

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)