590 likes | 810 Views
Chapter 5. Trees. Binary trees. A binary tree is a finite set of elements that is either empty or is partitioned into 3 disjoint subsets:. root left subtree right subtree. An example of binary tree (1). root : A node : A, B, C, …, H, I father of B: A sons of B: D, E
E N D
Chapter 5 Trees
Binary trees • A binary tree is a finite set of elements that is either empty or is partitioned into 3 disjoint subsets: root left subtree right subtree
An example of binary tree (1) root: A node: A, B, C, …, H, I father of B: A sons of B: D, E left son of B: D right son of B: E depth: 3 ancestors of E: A, B descendants of B: D, E, G level 0 A 1 B C 2 D E F 3 G H I
An example of binary tree (2) left descendant of B: D right descendant of B: E, G brother: B and C are brothers D and E are brothers leaf: a node that has no sons e.g. D, G, H, I right subtree of A: left subtree of A: B C D E F G H I
Not binary trees A A B C B C D E F D E F A G H I G B C (a) (b) D E F G H I (c)
Strictly binary tree • Each nonleaf node has nonempty left and right subtrees. A C B E D F G
Complete binary tree of depth 3 • # of nodes in a complete binary tree of depth d: ** A B C D E F G H I J K L M N O
A B C D E Implementation of a binary tree • Each node has 3 fields. • 若欲如 doubly linked list, 有雙向的 link, 則加入 "father" 而成為 4 個 field. left son information right son
Linked array representation #define NUMNODES 500 struct nodetype{ int info; int left; int right; int father; }; struct nodetype node[NUMNODES];
Dynamic node representation struct nodetype{ int info; struct nodetype *left; struct nodetype *right; struct nodetype *father; }; typedef struct nodetype *NODEPTR;
Creation of a new tree • maketree(x): Create a new tree consisting of a single node NODEPTR maketree(int x) { NODEPTR p; p = getnode(); p->info = x; p->left = NULL; p->right = NULL; return(p); } /* end maketree */ X
Creation of a new son • setleft(p, x): create a new left son of node p with information field x. void setleft(NODEPTR p, int x) { if (p == NULL) printf("void insertion\n"); else if (p->left != NULL) printf("invalid insertion\n"); else p->left = maketree(x); } /* end setleft */ p p x
14 4 15 3 9 18 7 16 20 5 17 An application of binary trees • Finding all duplicate numbers in a number series. • 14, 15, 4, 9, 7, 18, 3, 5, 16, 4, 20, 17, 9, 14, 5 • build a binary search tree: smaller numbers stored in the left subtree. larger numbers stored in the right subtree. • Duplicate numbers: **
Implementation with C struct nodetype{ int info; struct nodetype *left; struct nodetype *right; }; typedef struct nodetype *NODEPTR; main() { NODEPTR ptree; NODEPTR p, q; int number; scanf("%d", &number); ptree = maketree(number);
14 4 15 9 7 while (scanf("%d", &number) != EOF){ p = q = ptree; while (number != p->info && q != NULL){ p = q; if (number < p->info) q = p->left; else q = p->right; } /* end while */ if (number == p->info) printf("%d is a duplicate\n", number); else if (number < p->info) setleft(p, number); else setright(p, number); } /* end while */ } /* end main */
Traversals in a binary tree (1) (1) preorder (depth-first order) • root • left subtree • right subtree (2)inorder (symmetric order) • left subtree • root • right subtree (3) postorder • left subtree • right subtree • root
A B C D E F G H I Traversals in a binary tree (2) • preorder : • inorder : ** • postorder :
Preorder traversal void pretrav(NODEPTR tree) { if (tree != NULL){ printf("%d\n", tree->info); // visit the root pretrav(tree->left); // traverse left subtree pretrav(tree->right);// traverse right subtree } /* end if */ } /* end pretrav */
Inorder traversal void intrav(NODEPTR tree) { if (tree != NULL){ intrav(tree->left); // traverse left subtree printf("%d\n", tree->info); // visit the root intrav(tree->right); // traverse right subtree } /* end if */ } /* end intrav */
Postorder traversal void posttrav(NODEPTR tree) { if (tree != NULL){ posttrav(tree->left); //traverse left subtree posttrav(tree->right);//traverse right subtree printf("%d\n", tree->info); // visit the root } /* end if */ } /* end posttrav */
Binary search tree • 14, 15, 4, 9, 7, 18, 3, 5, 16, 4, 20, 17, 9, 14, 5 14 15 4 3 9 14 18 7 9 16 20 17 5 • inorder traversal • sorted: 3,4,4,5,5,7,9,9,14,14,15,16,17,18,20 4 5
Expressions in binary trees • prefix: + A * B C ( preorder traversal ) • infix: A + B * C ( inorder traversal ) • postfix: A B C * + ( postorder traversal ) + A * B C
Implicit array for an almost-complete binary tree (1) (1) Each leaf is either at level d or at level d-1. (2) For any node n with a right descendant at level d, all the left descendants of node n that are leaves are also at level d. A 0 2 B C 1 3 D E F G 6 5 4 H I J 8 9 7
A B C D E F G Implicit array for an almost-complete binary tree (2) • An almost complete binary tree can be implemented by an array. • sons of node p : • father of node p: ** • not an almost complete binary tree:
Extension to not almost complete binary trees A B C D E F G
Nonrecursive inorder traversal #define MAXSTACK 100 void intrav2(NODEPTR tree) { struct stack{ int top; NODEPTR item[MAXSTACK]; }s; NODEPTR p; s.top = -1; p = tree; do{ /*travel down left branches as far as possible */ /* saving pointers to nodes passed */ while (p != NULL){ push(s, p); p = p->left; } /* end while */
/* check if finished */ if (!empty(s)){ /* at this point the left subtree is empty */ p = pop(s); printf("%d\n", p->info); /* visit the root */ p = p->right; /* traverse right subtree */ } /* end if */ } while (!empty(s) || p != NULL); } /* end intrav2 */ • The recursion stack cannot be eliminated.
Right in-threaded binary tree • A node with an empty right subtree points to its inorder successor. It can be traversed in inorder without a stack. setleft(p, x): A C B ** F E D setright(p, x): ** G H I
Implementation of a right in-threaded binary tree • If the array implementation is used, • positive pointer: normal right son • negative pointer: inorder successor • dynamic implementation: struct nodetype{ int info; struct nodetype *left; // pointer to left son struct nodetype *right; // pointer to right son int rthread; // rthread is TRUE if // right is NULL or } // a non-NULL thread typedef struct nodetype *NODEPTR;
Implementation with C (1) void intrav3(NODEPTR tree) // No stack is used { NODEPTR p, q; p = tree; do{ q = NULL while (p != NULL){ /* traverse left branch */ q = p; p = p->left; } /* end while */
Implementation with C (2) if (q != NULL){ printf("%d\n", q->info); p = q->right; while (q->rthread && p != NULL){ printf("%d\n", p->info); q = p; p = p->right; } /* end while */ } /* end if */ }while (q != NULL) } /* end intrav3 */
Heterogeneous binary trees '+' • The binary tree represents 3 + 4*(6-7)/5 + 3. '+' 3 '/' 3 5 '*' 4 '-' 6 7
Evaluation of an expression represented by a binary tree (1) #define OPERATOR 0 #define OPERAND 1 struct nodetype{ short int utype; /* OPERATOR or OPERAND */ union{ char chinfo; float numinfo; }info; struct nodetype *left; struct nodetype *right; }; typedef struct nodetype *NODEPTR; float evalbintree(NODEPTR tree) { float opnd1, opnd2; char symb;
Evaluation of an expression represented by a binary tree(2) if (tree->utype == OPERAND) /* expression is a single */ return (tree->numinfo); /* operand */ /* tree->utype == OPERATOR */ /* evaluate the left subtree */ opnd1 = evalbintree(tree->left); /* evaluate the right subtree */ opnd2 = evalbintree(tree->right); symb = tree->chinfo; /* extract the operator */ /* apply the operator and return the result */ return(oper(symb, opnd1, opnd2)); } /* end evalbintree */
The Huffman code (1) • Suppose we have a set of symbols: A, B, C, D 1) Each symbol is encoded by 3 bits (inefficient) Message A B A C C D A would be encoded by 21 bits: symbolcode A 0 1 0 B 1 0 0 C 0 0 0 D 1 1 1 010 100 010 000 000 111 010
The Huffman code (2) 2) Each symbol is encoded by 2 bits • Message A B A C C D A would be encoded by 14 bits: symbolcode A 00 B 01 C 10 D 11 00 01 00 10 10 11 00
The Huffman code (3) 3) Huffman codes (variable-length codes) symbolcode A 0 B 110 C 10 D 111 • Message A B A C C D A would be encoded by 13 bits: 0 110 0 10 10 111 0 • A frequently used symbol is encoded by a short bit string.
ACBD,7 1 0 CBD,4 A,3 0 1 C,2 BD,2 1 0 B,1 D,1 Huffman tree
Construction of a Huffman tree symbol E I A D C G B F H 25 15 15 12 7 6 6 4 1 25 15 15 12 7 6 6 5 25 15 15 12 11 7 6 25 15 15 13 12 11 25 23 15 15 13 28 25 23 15 38 28 25 53 38 91 frequency
IHFBDEGCA,91 IHFBD, 38 EGCA, 53 I, 15 HFBD, 23 E, 25 GCA, 28 HFB, 11 D, 12 GC, 13 A, 15 HF, 5 B, 6 G, 6 C, 7 H, 1 F, 4 Sym Freq Code Sym Freq Code Sym Freq Code A 15 111 D 12 011 G 6 1100 B 6 0101 E 25 10 H 1 01000 C 7 1101 F 4 01001 I 15 00
The result of Huffman coding decode • A Huffman tree is a strictly binary tree. The Huffman algorithm is an optimal encoding scheme. 111 01000 10 111 011 A H E A D encode
Representing lists as binary trees (1) • n: # of elements array linked list binary tree (balanced) insertion or deletion (kth element) O(1) (inserting an element following a given element) O(n-k) O(log2n) finding the kth element O(1) O(k) O(log2n)
Representing lists as binary trees (2) A B C D E F null • nonleaf node: # of leaves in the left subtree • leaf node: contents of a list element 4 k=3 Finding the kth element: k=3 2 1 k=1 1 1 E F A B C D
Representing lists as binary trees (3) • A complete binary tree of depth d has 2d+1-1 nodes or 2d leaf nodes. • If an almost complete binary tree is used to represent a list, the kth element can be found by accessing O(log2n) nodes.
Deleting elements in the list (1) 4 3 tree 1 1 2 2 E F E F 1 1 1 D X A B C D A B X p (a) (b)
1 1 A E F Deleting elements in the list (2) • Time: O(log2n) 2 1 2 E F 1 A B (d) X (c)
A B C D G E F Trees • root of the tree: A B, C, D are brothers. • degree of a node: # of sons degree of A : 3 degree of B : 2 degree of C : 0 degree of D : 1 Fig.1
A A B C D C D B G E F G F E Ordered trees • ordered tree: the subtrees of each node form an ordered set • Fig.1 and Fig.2 are different ordered trees. • In Fig.1, oldest son of A : B youngest son of A : D Fig.1 Fig.2
Representation of trees oldest son information next brother A null B null C D null null E null F null null G null
A B C D oldest son left son next brother right son A G E F B E C D F G Ordered tree and binary tree • An ordered tree can be represented as a binary tree. Binary tree ordered tree