treetest.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 109 行

CPP
109
字号


#include "base/tree.h"
#include "base/treewalk.h"
#include "base/memory.h"

#include <stdio.h>
#include <iostream.h>


class NodePrinter: public CL_Object {

public:
    bool Print (CL_VoidPtrTreeNode& node, long depth);
    bool Start (CL_VoidPtrTreeNode& node, long depth);
    bool End   (CL_VoidPtrTreeNode& node, long depth);
};

bool NodePrinter::Print (CL_VoidPtrTreeNode& node, long depth)
{
    printf ("Depth %ld content '%s' label %ld\n", depth, (char*)
            node.Content(), node.Label());
    return TRUE;
}

bool NodePrinter::Start  (CL_VoidPtrTreeNode& node, long depth)
{
    for (long i = 0; i < 4*depth; i++) putchar (' ');
    printf ("Depth %ld content '%s' label %ld\n", depth, (char*)
            node.Content(), node.Label());
    if (node.ChildCount() > 0) {
        for (long i = 0; i < 4*depth; i++) putchar (' ');
        printf ("{\n");
    }
    return TRUE;
}


bool NodePrinter::End  (CL_VoidPtrTreeNode& node, long depth)
{
    if (node.ChildCount() > 0) {
        for (long i = 0; i < 4*depth; i++) putchar (' ');
        printf ("}\n");
    }
    return TRUE;
}



typedef CL_Binding<NodePrinter> NodeBind;

int main ()
{
    CL_MemoryLeakChecker check (cout);
    CL_VoidPtrTree aTree;
    NodePrinter prt1;

    aTree.NewRoot (1)->Content() = "Level 0 (root)";
    aTree.AddChild (2, 1)->Content() = "Level 1, #1";
    aTree.AddChild (3, 1)->Content() = "Level 1, #2";
    aTree.AddChild (4, 1)->Content() = "Level 1, #3";

    aTree.AddChild (5, 3)->Content() = "Level 2, #1";
    aTree.AddChild (6, 3)->Content() = "Level 2, #2";

    for (long i = 1; i <= 6; i++)
        printf ("Node %ld has %ld children\n", i,
                aTree.Node (i)->ChildCount());

    printf ("----------------------\nPost-order walk:\n\n");
    CL_VoidPtrTreePostWalker walker (aTree.Root());
    for (walker.Reset (); walker.More(); ) {
        CL_VoidPtrTreeNode* n = walker.Next();
        printf ("%ld: %s\n", n->Label(), n->Content());
    }

    printf ("----------------------\nPre-order walk:\n\n");
    CL_VoidPtrTreePreWalker pwalker (aTree.Root());
    for (pwalker.Reset (); pwalker.More(); ) {
        CL_VoidPtrTreeNode* n = pwalker.Next();
        printf ("%ld: %s\n", n->Label(), n->Content());
    }



    NodeBind print_bind (&prt1, (NodeBind::MethodPtr) &NodePrinter::Print);
    aTree.PostOrderWalk (1, print_bind);

    printf ("--------------\nBegin general traversal:\n");
    NodeBind start_bind (&prt1, (NodeBind::MethodPtr) &NodePrinter::Start);
    NodeBind end_bind   (&prt1, (NodeBind::MethodPtr) &NodePrinter::End);
    long cnt = aTree.Traverse (1, start_bind, end_bind);

    printf ("--------------\n"
            "End General traversal\nCount returned:%d\n", cnt);

    CL_VoidPtrTree* anotherTree = aTree.ExtractSubtree (3);
    char* p = (char*) aTree.Node(1)->Content();


    aTree.PostOrderWalk (1, print_bind);
    printf ("--------------\n");
    anotherTree->PostOrderWalk (3, print_bind);
    delete anotherTree;
return(0);
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?