非常具体的树遍历方法

时间:2014-06-20 23:28:55

标签: algorithm recursion data-structures tree traversal

我一直在努力开发/寻找一种非常具体的方法来遍历树形结构。我真的只熟悉2~3种最常用的树遍历方法,而且我不太了解有效搜索网页的行话,所以如果我问一些非常明显或基本的东西,请原谅我。

我有以下树结构(不一定是二叉树):

Tree structure http://renebokhorst.com/stackoverflow/ProblemTree.png

假设我在节点" AAA"处输入树。我希望该方法首先使用自顶向下方法遍历其底层节点。

Tree structure http://renebokhorst.com/stackoverflow/ProblemTree2.png

然而,在此之后,我希望该方法向上移动树,并处理它下面的所有内容,除了它之前已经完成的部分。

Tree structure http://renebokhorst.com/stackoverflow/ProblemTree3.png

我希望它一直这样做,直到它到达顶级节点并完成。

Tree structure http://renebokhorst.com/stackoverflow/ProblemTree4.png

一个非常具体的要求是我们不能跳过"节点。输入或返回节点必须从其父母或孩子那里完成。在进入节点之前,我还会注册访问者是在树上向上还是向下遍历(这是一些访问者的必要信息)。无论我们是第一次进入树,还是我们是否再次通过入口节点,我也可以类似地提升标志。除了引用节点之外,访问者可能不会访问任何节点两次,只要引发RE_ENTRY标志,它就可以多次传递。理想情况下,我不想跟踪过去已经传递的节点列表。 现在我尝试了一些不同的方法

case GLOBAL_SPREAD:
{
    if ( pVisitor->LastVisited == NULL )
        pVisitor->VisitDirection = ENTRY;

    pVisitor->visit(this);
    for ( uint32 i(0) ; i < Children.size() ; i += 1 )
    {
        pVisitor->VisitDirection = DOWN;
        Children[i]->Accept(pVisitor);
    }

    break;
}

这段代码当然不会执行自顶向下遍历起始节点下的所有内容。当我尝试添加会将访问者撞到树上并从那里进行自上而下遍历的代码时,会出现问题。在访问孩子之前调用Parent-&gt; Accept(pVisitor)显然不会产生所需的结果。在访问子节点之后调用Parent-> Accept(pVisitor)将仅在入口节点的情况下产生期望的结果。对于每个其他节点,它都会导致问题。

我想知道是否有人对这些类型的树遍历方法有任何经验,以及我是否真的有足够的信息来进行这种遍历。同样重要的是,我不跟踪以前访问过的项目的任何列表。充其量我可以跟踪函数本身以前访问过哪个节点。也许这是一个众所周知且广泛记录的遍历方法,我只是不知道它的名字。

提前致谢!

1 个答案:

答案 0 :(得分:2)

此代码似乎实现了您的要求。这项工作的关键是访问第一个节点(无论是什么)被视为UP操作。 print_tree()print_preorder()函数实现树的正常前序遍历;它们用于表明数据结构的形状正确。 dfs_traversal()dfs_traverse()函数实现了特殊的DFS遍历。测试代码测试两个特定示例(AAAA节点),然后对树中每个节点的遍历进行详尽检查。

代码

#include <stdio.h>

enum { MAX_CHILD = 2 };
enum { UP = 1, DOWN = 2 };
typedef struct Node Node;

struct Node
{
    char    name[8];
    int     number;
    Node   *parent;
    Node   *child[MAX_CHILD];
};

static Node data[] =
{
    { "A",     0,        0, { &data[ 1], &data[ 2], }, },
    { "AA",   -3, &data[0], { &data[ 3], &data[ 4], }, },
    { "AB",   +3, &data[0], { &data[ 5], &data[ 6], }, },
    { "AAA",  -4, &data[1], { &data[ 7], &data[ 8], }, },
    { "AAB",  +4, &data[1], { &data[ 9], &data[10], }, },
    { "ABA",  -4, &data[2], { &data[11], &data[12], }, },
    { "ABB",  +4, &data[2], { &data[13], &data[14], }, },
    { "AAAA",  0, &data[3], {         0,         0, }, },
    { "AAAB", +5, &data[3], {         0,         0, }, },
    { "AABA", -5, &data[4], {         0,         0, }, },
    { "AABB", +5, &data[4], {         0,         0, }, },
    { "ABAA", -5, &data[5], {         0,         0, }, },
    { "ABAB", +5, &data[5], {         0,         0, }, },
    { "ABBA", -5, &data[6], {         0,         0, }, },
    { "ABBB", +5, &data[6], {         0,         0, }, },
};
enum { NUM_NODES = sizeof(data) / sizeof(data[0]) };

static void visit(Node *node, int up_down)
{
    printf("%4s: ", up_down == UP ? "UP" : "DOWN");
    printf(" %5s [%2d] N = %p; P = %p\n", node->name, node->number,
            (void *)node, (void *)node->parent);
}

static void print_tree(Node *node)
{
    if (node != 0)
    {
        visit(node, DOWN);
        for (int i = 0; i < MAX_CHILD; i++)
            print_tree(node->child[i]);
    }
}

static void print_preorder(const char *tag, Node *node)
{
    printf("Tree starting from %s:\n", tag);
    print_tree(node);
}

static void dfs_traverse(int up_down, Node *node, Node *skip)
{
    if (node != 0 && node != skip)
    {
        visit(node, up_down);
        for (int i = 0; i < MAX_CHILD; i++)
            dfs_traverse(DOWN, node->child[i], skip);
        if (node->parent != 0 && up_down == UP)
            dfs_traverse(UP, node->parent, node);
    }
}

static void dfs_traversal(const char *tag, int up_down, Node *node, Node *skip)
{
    printf("DFS starting from %s\n", tag);
    dfs_traverse(up_down, node, skip);
}

int main(void)
{
    Node *aaa = &data[3];
    Node *root = &data[0];

    print_preorder("root", root);
    print_preorder("aaa",  aaa);

    dfs_traversal("aaa",  UP, aaa,  0);
    dfs_traversal("root", UP, root, 0);

    for (int i = 0; i < NUM_NODES; i++)
        dfs_traversal(data[i].name, UP, &data[i], 0);

    return 0;
}

示例输出

Tree starting from root:
DOWN:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
Tree starting from aaa:
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DFS starting from aaa
  UP:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from root
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from A
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AA
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AB
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from AAA
  UP:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AAB
  UP:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from ABA
  UP:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from ABB
  UP:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from AAAA
  UP:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
  UP:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AAAB
  UP:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AABA
  UP:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
  UP:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from AABB
  UP:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
  UP:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
  UP:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
DFS starting from ABAA
  UP:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
  UP:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from ABAB
  UP:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from ABBA
  UP:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
  UP:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0
DFS starting from ABBB
  UP:   ABBB [ 5] N = 0x10dbab270; P = 0x10dbab130
  UP:    ABB [ 4] N = 0x10dbab130; P = 0x10dbab090
DOWN:   ABBA [-5] N = 0x10dbab248; P = 0x10dbab130
  UP:     AB [ 3] N = 0x10dbab090; P = 0x10dbab040
DOWN:    ABA [-4] N = 0x10dbab108; P = 0x10dbab090
DOWN:   ABAA [-5] N = 0x10dbab1f8; P = 0x10dbab108
DOWN:   ABAB [ 5] N = 0x10dbab220; P = 0x10dbab108
  UP:      A [ 0] N = 0x10dbab040; P = 0x0
DOWN:     AA [-3] N = 0x10dbab068; P = 0x10dbab040
DOWN:    AAA [-4] N = 0x10dbab0b8; P = 0x10dbab068
DOWN:   AAAA [ 0] N = 0x10dbab158; P = 0x10dbab0b8
DOWN:   AAAB [ 5] N = 0x10dbab180; P = 0x10dbab0b8
DOWN:    AAB [ 4] N = 0x10dbab0e0; P = 0x10dbab068
DOWN:   AABA [-5] N = 0x10dbab1a8; P = 0x10dbab0e0
DOWN:   AABB [ 5] N = 0x10dbab1d0; P = 0x10dbab0e0