| .\" $NetBSD$ |
| .\" Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> |
| .\" All rights reserved. |
| .\" |
| .\" Redistribution and use in source and binary forms, with or without |
| .\" modification, are permitted provided that the following conditions |
| .\" are met: |
| .\" 1. Redistributions of source code must retain the above copyright |
| .\" notice, this list of conditions and the following disclaimer. |
| .\" 2. Redistributions in binary form must reproduce the above copyright |
| .\" notice, this list of conditions and the following disclaimer in the |
| .\" documentation and/or other materials provided with the distribution. |
| .\" 3. The name of the author may not be used to endorse or promote products |
| .\" derived from this software without specific prior written permission. |
| .\" |
| .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
| .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY |
| .\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
| .\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| .\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| .\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| .\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| .\" |
| .\" OpenBSD: tsearch.3,v 1.2 1998/06/21 22:13:49 millert Exp |
| .\" $FreeBSD: src/lib/libc/stdlib/tsearch.3,v 1.7 2001/09/07 14:46:36 asmodai Exp $ |
| .\" |
| .Dd June 15, 1997 |
| .Dt TSEARCH 3 |
| .Os |
| .Sh NAME |
| .Nm tsearch , tfind , tdelete , twalk |
| .Nd manipulate binary search trees |
| .Sh SYNOPSIS |
| .In search.h |
| .Ft void * |
| .Fn tdelete "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" |
| .Ft void * |
| .Fn tfind "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" |
| .Ft void * |
| .Fn tsearch "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" |
| .Ft void |
| .Fn twalk "const void *root" "void (*compar) (const void *, VISIT, int)" |
| .Sh DESCRIPTION |
| The |
| .Fn tdelete , |
| .Fn tfind , |
| .Fn tsearch , |
| and |
| .Fn twalk |
| functions manage binary search trees based on algorithms T and D |
| from Knuth (6.2.2). The comparison function passed in by |
| the user has the same style of return values as |
| .Xr strcmp 3 . |
| .Pp |
| .Fn Tfind |
| searches for the datum matched by the argument |
| .Fa key |
| in the binary tree rooted at |
| .Fa rootp , |
| returning a pointer to the datum if it is found and NULL |
| if it is not. |
| .Pp |
| .Fn Tsearch |
| is identical to |
| .Fn tfind |
| except that if no match is found, |
| .Fa key |
| is inserted into the tree and a pointer to it is returned. If |
| .Fa rootp |
| points to a NULL value a new binary search tree is created. |
| .Pp |
| .Fn Tdelete |
| deletes a node from the specified binary search tree and returns |
| a pointer to the parent of the node to be deleted. |
| It takes the same arguments as |
| .Fn tfind |
| and |
| .Fn tsearch . |
| If the node to be deleted is the root of the binary search tree, |
| .Fa rootp |
| will be adjusted. |
| .Pp |
| .Fn Twalk |
| walks the binary search tree rooted in |
| .Fa root |
| and calls the function |
| .Fa action |
| on each node. |
| .Fa Action |
| is called with three arguments: a pointer to the current node, |
| a value from the enum |
| .Sy "typedef enum { preorder, postorder, endorder, leaf } VISIT;" |
| specifying the traversal type, and a node level (where level |
| zero is the root of the tree). |
| .Sh SEE ALSO |
| .Xr bsearch 3 , |
| .Xr hsearch 3 , |
| .Xr lsearch 3 |
| .Sh RETURN VALUES |
| The |
| .Fn tsearch |
| function returns NULL if allocation of a new node fails (usually |
| due to a lack of free memory). |
| .Pp |
| .Fn Tfind , |
| .Fn tsearch , |
| and |
| .Fn tdelete |
| return NULL if |
| .Fa rootp |
| is NULL or the datum cannot be found. |
| .Pp |
| The |
| .Fn twalk |
| function returns no value. |