An AA tree in computer science is a form of balanced tree used for storing and retrieving ordered data efficiently. AA trees are named for Arne Andersson, their inventor.

AA trees are a variation of the red-black tree, which in turn is an enhancement to the binary search tree. Unlike red-black trees, red nodes on an AA tree can only be added as a right subchild. In other words, no red node can be a left sub-child. This results in the simulation of a 2-3 tree instead of a 2-3-4 tree, which greatly simplifies the maintenance operations. The maintenance algorithms for a red-black tree need to consider seven different shapes to properly balance the tree:

Red Black Shape Cases.svg

An AA tree on the other hand only needs to consider two shapes due to the strict requirement that only right links can be red:

AA Tree Shape Cases.svg

Contents

Balancing rotations [link]

Typically, AA trees are implemented with levels instead of colors, unlike red-black trees. Each node has a level field, and the following invariants must remain true for the tree to be valid:

  1. The level of a leaf node is one.
  2. The level of a left child is exactly one less than that of its parent.
  3. The level of a right child is equal to or one less than that of its parent.
  4. The level of a right grandchild is strictly less than that of its grandparent.
  5. Every node of level greater than one must have two children.

A link where the child's level is equal to that of its parent is called a horizontal link, and can be thought of as a red link in the red-black tree context. Right horizontal links are allowed as long as there are never two consecutive horizontal right links; left horizontal links are always forbidden.

Only two operations are needed for maintaining balance in an AA tree. These operations are called skew and split. Skew is a right rotation when an insertion or deletion creates a left horizontal link. Split is a conditional left rotation when an insertion or deletion creates two horizontal right links, which once again corresponds to two consecutive red links in red-black trees.

function skew is
    input: T, a node representing an AA tree that needs to be rebalanced.
    output: Another node representing the rebalanced AA tree.

    if nil(T) then
        return Nil
    else if nil(left(T)) then
        return T
    else if level(left(T)) == level(T) then
        Swap the pointers of horizontal left links.
        L = left(T)
        left(T) := right(L)
        right(L) := T
        return L
    else
        return T
    end if
end function

Skew: AA Tree Skew2.svg

function split is
    input: T, a node representing an AA tree that needs to be rebalanced.
    output: Another node representing the rebalanced AA tree.

    if nil(T) then
        return Nil
    else if nil(right(T)) or  nil(right(right(T))) then
        return T
    else if level(T) == level(right(right(T))) then
        We have two horizontal right links.  Take the middle node, elevate it, and return it.
        R = right(T)
        right(T) := left(R)
        left(R) := T
        level(R) := level(R) + 1
        return R
    else
        return T
    end if
end function

Split: AA Tree Split2.svg

Insertion [link]

Insertion begins with the normal binary tree search and insertion procedure. Then, as the call stack unwinds (assuming a recursive implementation of the search), it's easy to check the validity of the tree and perform any rotations as necessary. If a horizontal left link arises, a skew will be performed, and if two horizontal right links arise, a split will be performed, possibly incrementing the level of the new root node of the current subtree. Note, in the code as given above, the increment of level(T). This makes it necessary to continue checking the validity of the tree as the modifications bubble up from the leaves.

function insert is
    input: X, the value to be inserted, and T, the root of the tree to insert it into.
    output: A balanced version T including X.

    Do the normal binary tree insertion procedure. Set the result of the
    recursive call to the correct child in case a new node was created or the
    root of the subtree changes.
    if nil(T) then
        Create a new leaf node with X.
        return node(X, 1, Nil, Nil)
    else if X < value(T) then
        left(T) := insert(X, left(T))
    else if X > value(T) then
        right(T) := insert(X, right(T))
    end if
    Note that the case of X == value(T) is unspecified. As given, an insert
    will have no effect. The implementor may desire different behavior.

    Perform skew and then split. The conditionals that determine whether or
    not a rotation will occur or not are inside of the procedures, as given
    above.
    T := skew(T)
    T := split(T)

    return T
end function

Deletion [link]

As in most balanced binary trees, the deletion of an internal node can be turned into the deletion of a leaf node by swapping the internal node with either its closest predecessor or successor, depending on which are in the tree or on the implementor's whims. Retrieving a predecessor is simply a matter of following one left link and then all of the remaining right links. Similarly, the successor can be found by going right once and left until a null pointer is found. Because of the AA property of all nodes of level greater than one having two children, the successor or predecessor node will be in level 1, making their removal trivial.

To re-balance a tree, there are a few approaches. The one described by Andersson in his original paper is the simplest, and it is described here, although actual implementations may opt for a more optimized approach. After a removal, the first step to maintaining tree validity is to lower the level of any nodes whose children are two levels below them, or who are missing children. Then, the entire level must be skewed and split. This approach was favored, because when laid down conceptually, it has three easily understood separate steps:

  1. Decrease the level, if appropriate.
  2. Skew the level.
  3. Split the level.

However, we have to skew and split the entire level this time instead of just a node, complicating our code.

function delete is
    input: X, the value to delete, and T, the root of the tree from which it should be deleted.
    output: T, balanced, without the value X.
   
    if nil(T) then
        return T
    else if X > value(T) then
        right(T) := delete(X, right(T))
    else if X < value(T) then
        left(T) := delete(X, left(T))
    else
        If we're a leaf, easy, otherwise reduce to leaf case. 
        if leaf(T) then
            return Nil
        else if nil(left(T)) then
            L := successor(T)
            right(T) := delete(L, right(T))
            value(T) := L
        else
            L := predecessor(T)
            left(T) := delete(L, left(T))
            value(T) := L
        end if
    end if

    Rebalance the tree. Decrease the level of all nodes in this level if
    necessary, and then skew and split all nodes in the new level.
    T := decrease_level(T)
    T := skew(T)
    right(T) := skew(right(T))
    right(right(T)) := skew(right(right(T)))
    T := split(T)
    right(T) := split(right(T))
    return T
end function
function decrease_level is
    input: T, a tree for which we want to remove links that skip levels.
    output: T with its level decreased.

    should_be = min(level(left(T)), level(right(T))) + 1
    if should_be < level(T) then
        level(T) := should_be
        if should_be < level(right(T)) then
            level(right(T)) := should_be
        end if
    end if
    return T
end function

A good example of deletion by this algorithm is present in the Andersson paper.

Performance [link]

The performance of an AA tree is equivalent to the performance of a red-black tree. While an AA tree makes more rotations than a red-black tree, the simpler algorithms tend to be faster, and all of this balances out to result in similar performance. A red-black tree is more consistent in its performance than an AA tree, but an AA tree tends to be flatter, which results in slightly faster search times.[1]

See also [link]

References [link]

External links [link]


https://wn.com/AA_tree

Tree

In botany, a tree is a perennial plant with an elongated stem, or trunk, supporting branches and leaves in most species. In some usages, the definition of a tree may be narrower, including only woody plants with secondary growth, plants that are usable as lumber or plants above a specified height. Trees are not a taxonomic group but include a variety of plant species that have independently evolved a woody trunk and branches as a way to tower above other plants to compete for sunlight. In looser senses, the taller palms, the tree ferns, bananas and bamboos are also trees. Trees tend to be long-lived, some reaching several thousand years old. The tallest known tree, a coast redwood named Hyperion, stands 115.6 m (379 ft) high. Trees have been in existence for 370 million years. It is estimated that there are just over 3 trillion mature trees in the world.

A tree typically has many secondary branches supported clear of the ground by the trunk. This trunk typically contains woody tissue for strength, and vascular tissue to carry materials from one part of the tree to another. For most trees it is surrounded by a layer of bark which serves as a protective barrier. Below the ground, the roots branch and spread out widely; they serve to anchor the tree and extract moisture and nutrients from the soil. Above ground, the branches divide into smaller branches and shoots. The shoots typically bear leaves, which capture light energy and convert it into sugars by photosynthesis, providing the food for the tree's growth and development. Flowers and fruit may also be present, but some trees, such as conifers, instead have pollen cones and seed cones; others, such as tree ferns, produce spores instead.

Trees in mythology

Trees are significant in many of the world's mythologies and religions, and have been given deep and sacred meanings throughout the ages. Human beings, observing the growth and death of trees, and the annual death and revival of their foliage, have often seen them as powerful symbols of growth, death and rebirth. Evergreen trees, which largely stay green throughout these cycles, are sometimes considered symbols of the eternal, immortality or fertility. The image of the Tree of life or world tree occurs in many mythologies.

Sacred or symbolic trees include the Banyan and the Peepal (Ficus religiosa) trees in Hinduism, the Yule Tree in Germanic mythology, the Tree of Knowledge of Judaism and Christianity, the Bodhi tree in Buddhism and Saglagar tree in Mongolian Tengriism. In folk religion and folklore, trees are often said to be the homes of tree spirits. Germanic paganism as well as Celtic polytheism both appear to have involved cultic practice in sacred groves, especially grove of oak. The term druid itself possibly derives from the Celtic word for oak. The Egyptian Book of the Dead mentions sycamores as part of the scenery where the soul of the deceased finds blissful repose.

Wood (Wu Xing)

Wood (Chinese: ; pinyin: ), sometimes translated as Tree, is the growing of the matter, or the matter's growing stage. Wood is the first phase of Wu Xing. Wood is yang in character. It stands for springtime, the east, the planet Jupiter, the color green, wind, and the Azure Dragon (Qing Long) in Four Symbols.

The Wu Xing are chiefly an ancient mnemonic device for systems with 5 stages; hence the preferred translation of "tree" over "wood".

Attributes

In Chinese Taoist thought, Wood attributes are considered to be strength and flexibility, as with bamboo. It is also associated with qualities of warmth, generosity, co-operation and idealism. The Wood person will be expansive, outgoing and socially conscious. The wood element is one that seeks ways to grow and expand. Wood heralds the beginning of life, springtime and buds, sensuality and fecundity. Wood needs moisture to thrive.

In Chinese medicine, wood is associated with negative feelings of anger, positive feelings of patience, and altruism.

Podcasts:

PLAYLIST TIME:

Black Days Begin

by: Atreyu

We're all hell bent on destruction
Trying to erase black spots on our souls
Hide from a violent eruption
Cataclysmic engulfing us all.
Lay down (lay down)
Tonight (tonight)
In front of the things
That conquer us all.
Your body, it taunts me
Your flesh is, oh so haunting.
Chorus:
Children of the night.
Throw your hands up in the air.
We all know we've lost the fight.
Hope dies out and we can see the end.
Black days begin.
Walk down this path of temptation
Deny the flesh ignore whats crawling below.
Stay true (stay true)
Stay cold (stay cold)
In front of the things
That conquer us all!
Your body, it taunts me
Your flesh is, oh so haunting.
Chorus
Solos
Your body, it taunts me
Your flesh is, oh so haunting.




×