Path: csiph.com!eternal-september.org!feeder.eternal-september.org!nntp.eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch Newsgroups: comp.lang.c Subject: AVL tree insertion - programming exercise Date: Tue, 06 Oct 2026 23:08:12 -0700 Organization: A noiseless patient Spider Lines: 55 Message-ID: <86ece2kppv.fsf@linuxsc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Wed, 07 Oct 2026 06:08:14 +0000 (UTC) Injection-Info: dont-email.me; logging-data="2740258"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1//lLn+ijGyPalHiKZwtiVJ0NrSgv7Afus="; posting-host="f116a0ff36505fb6c1fca8f439768e04" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:k+TFpKI7DgusFFGq9r7Io9nLxNI= sha1:RWUauh4nFbelxEQqCvyz2MiGcUI= sha256:0ruUPFCrFPSgluzNXs6iojQb6PIKlirs2RmZ2yVn3MU= sha1:jkFr+5Tgh+ro2WbPnA3UO/eS8/I= sha256:C6LMPayNuMsMiNCeHU82QiCcoO/rZ+MeTfT20xY93JA= Xref: csiph.com comp.lang.c:402780 I offer this small programming exercise for anyone who is interested. Write a function to insert a value into an AVL tree. Here is an outline of the basic data structure involved: #include typedef uintptr_t Link; typedef signed int Key; typedef struct { Link sons[2]; Key key; } Node; static Node * as_tree( Link link ){ return (Node*)(link & ~(0?link:1)); } static _Bool is_tall( Link link ){ return link & 1; } A Node is an element in the tree, with two child pointers, the sons[2] array. These links are basically pointers, but held as uintptr_t so they can take one of the bits to mean "tall", which means taller than the other subtree of the node. The tree structure should maintain an invariant that at most one of the two sons of each node is "tall", and if set then the height of that subtree is one larger than the height of the other subtree. Of course if both subtrees are the same height then neither should be labeled as tall. What we're looking for is a function to add a key to an existing tree (possibly empty), which is held as a Node *. Example: Node *root = 0; add_key( &root, 1 ); add_key( &root, 2 ); add_key( &root, 3 ); add_key( &root, 4 ); add_key( &root, 5 ); should leave root as a reference to a tree with five values. Thus the exercise is to define the function void add_key( Node **, Key ); to add values to the AVL tree held in what the first argument points to.