tree.3
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. .TH TREE 3 "5 April 1994"
  2. ." from .TH TREE 3 "22 Jan 1993"
  3. ." from .TH TREE 2 "23 June 1986"
  4. .UC 4
  5. .SH NAME
  6. tree_init, tree_mung, tree_srch, tree_add, tree_delete, tree_trav
  7. - balanced binary tree routines
  8. .SH SYNOPSIS
  9. .nf
  10. .B void
  11. .B tree_init(tree)
  12. .B void **tree;
  13. .PP
  14. .B void *
  15. .B tree_srch(tree, compare, data)
  16. .B void **tree;
  17. .B int (*compare)();
  18. .B void *data;
  19. .PP
  20. .B void
  21. .B tree_add(tree, compare, data, del_uar)
  22. .B void **tree;
  23. .B int (*compare)();
  24. .B void *data;
  25. .B void (*del_uar)();
  26. .PP
  27. .B int
  28. .B tree_delete(tree, compare, data, del_uar)
  29. .B void **tree;
  30. .B int (*compare)();
  31. .B void *data;
  32. .B void (*del_uar)();
  33. .PP
  34. .B int
  35. .B tree_trav(tree, trav_uar)
  36. .B void **tree;
  37. .B int (*trav_uar)();
  38. .PP
  39. .B void
  40. .B tree_mung(tree, del_uar)
  41. .B void **tree;
  42. .B void (*del_uar)();
  43. .fi
  44. .SH DESCRIPTION
  45. These functions create and manipulate a balanced binary (AVL) tree.  Each node
  46. of the tree contains the expected left & right subtree pointers, a short int
  47. balance indicator, and a pointer to the user data.  On a 32 bit system, this
  48. means an overhead of 4+4+2+4 bytes per node (or, on a RISC or otherwise
  49. alignment constrained system with implied padding, 4+4+4+4 bytes per node).
  50. There is no key data type enforced by this package; a caller supplied
  51. compare routine is used to compare user data blocks.
  52. .PP
  53. Balanced binary trees are very fast on searches and replacements, but have a
  54. moderately high cost for additions and deletions.  If your application does a
  55. lot more searches and replacements than it does additions and deletions, the
  56. balanced (AVL) binary tree is a good choice for a data structure.
  57. .PP
  58. .I Tree_init
  59. creates an empty tree and binds it to
  60. .I tree
  61. (which for this and all other routines in this package should be declared as
  62. a pointer to void or int, and passed by reference), which can then be used by
  63. other routines in this package.  Note that more than one
  64. .I tree
  65. variable can exist at once; thus multiple trees can be manipulated
  66. simultaneously.
  67. .PP
  68. .I Tree_srch
  69. searches a tree for a specific node and returns either
  70. .I NULL
  71. if no node was found, or the value of the user data pointer if the node
  72. was found.
  73. .I compare
  74. is the address of a function to compare two user data blocks.  This routine
  75. should work much the way 
  76. .IR strcmp (3)
  77. does; in fact,
  78. .I strcmp
  79. could be used if the user data was a s-2NULs+2 terminated string.
  80. .I data
  81. is the address of a user data block to be used by
  82. .I compare
  83. as the search criteria.  The tree is searched for a node where
  84. .I compare
  85. returns 0.
  86. .PP
  87. .I Tree_add
  88. inserts or replaces a node in the specified tree.  The tree specified by
  89. .I tree
  90. is searched as in
  91. .I tree_srch,
  92. and if a node is found to match
  93. .I data,
  94. then the
  95. .I del_uar
  96. function, if non-s-2NULLs+2, is called with the address of the user data
  97. block for the node (this routine should deallocate any dynamic memory which
  98. is referenced exclusively by the node); the user data pointer for the node
  99. is then replaced by the value of
  100. .I data.
  101. If no node is found to match, a new node is added (which may or may not
  102. cause a transparent rebalance operation), with a user data pointer equal to
  103. .I data.
  104. A rebalance may or may not occur, depending on where the node is added
  105. and what the rest of the tree looks like.
  106. .I Tree_add
  107. will return the
  108. .I data
  109. pointer unless catastrophe occurs in which case it will return s-2NULLs+2.
  110. .PP
  111. .I Tree_delete
  112. deletes a node from
  113. .I tree.
  114. A rebalance may or may not occur, depending on where the node is removed from
  115. and what the rest of the tree looks like.
  116. .I Tree_delete
  117. returns TRUE if a node was deleted, FALSE otherwise.
  118. .PP
  119. .I Tree_trav
  120. traverses all of
  121. .I tree,
  122. calling
  123. .I trav_uar
  124. with the address of each user data block.  If
  125. .I trav_uar
  126. returns FALSE at any time,
  127. .I tree_trav
  128. will immediately return FALSE to its caller.  Otherwise all nodes will be 
  129. reached and
  130. .I tree_trav
  131. will return TRUE.
  132. .PP
  133. .I Tree_mung
  134. deletes every node in
  135. .I tree,
  136. calling
  137. .I del_uar
  138. (if it is not s-2NULLs+2) with the user data address from each node (see
  139. .I tree_add
  140. and
  141. .I tree_delete
  142. above).  The tree is left in the same state that
  143. .I tree_init
  144. leaves it in - i.e., empty.
  145. .SH BUGS
  146. Should have a way for the caller to specify application specific
  147. .I malloc
  148. and
  149. .I free
  150. functions to be used internally when allocating meta data.
  151. .SH AUTHOR
  152. Paul Vixie, converted and augumented from Modula-2 examples in
  153. .I Algorithms & Data Structures,
  154. Niklaus Wirth, Prentice-Hall, ISBN 0-13-022005-1.