孩子兄弟法建树

//Geeksun 2018.05.13
#include <iostream>
using namespace std;


struct Node
{
    char data;
    struct Node* firstChild;
    struct Node* rightSlib;
};
class Tree
{
public:
    Tree();
    ~Tree(){}
    void Tree_creat();
    struct Node* getRoot()
    {
        return root;
    };
    void preOrderTraverse(struct Node* node);
    void postOrderTraverse(struct Node* node);
    void levelOrderTraverse(struct Node* node);
private:
    struct Node* root;
    int size;
};
Tree::Tree()
{
    size = 0;
    root = NULL;
}
void Tree::Tree_creat()
{
    struct Node* array[20];
    char parent,child;
    cin >> parent >> child;
    while(child != '#')
    {
        struct Node* p = NULL;
        struct Node* node = new struct Node;
        node->data = child;
        node->firstChild = NULL;
        node->rightSlib = NULL;
        if(parent == '#')
        {
            root = node;
        }
        else
        {
            int i = 0;
            while(array[i]->data != parent&&i < size)
            {
                i++;
            }
            if(array[i]->data == parent)
            {
                if(array[i]->firstChild == NULL)
                {
                    array[i]->firstChild = node;
                }
                else
                {
                    p = array[i]->firstChild;
                    while(p->rightSlib != NULL)
                    {
                        p = p->rightSlib;
                    }
                    p->rightSlib = node;
                }
            }
        }
        array[size++] = node;
        cin >> parent >> child;
    }
}
void Tree::preOrderTraverse(struct Node* node)
{
    if(node)
    {
        cout << node->data << endl;
        preOrderTraverse(node->firstChild);
        preOrderTraverse(node->rightSlib);
    }
}
void Tree::postOrderTraverse(struct Node* node)
{
    if(node)
    {
        postOrderTraverse(node->firstChild);
        cout << node->data;
        postOrderTraverse(node->rightSlib);
    }
}
void Tree::levelOrderTraverse(struct Node* node)
{
    struct Node *p,*q;
    int head = 0,tail = 0;
    struct Node* queue[20];
    if(!node)
    {
        return;
    }
    queue[tail++] = node;
    while(head != tail)
    {
        p = queue[head++];
        cout << p->data;
        for(q = p->firstChild;q;q = q->rightSlib)
        {
            queue[tail++] = q;
        }
    }
}
int main()
{
    Tree myTree;
    myTree.Tree_creat();
    myTree.preOrderTraverse(myTree.getRoot());
    cout << endl;
    myTree.levelOrderTraverse(myTree.getRoot());
    return 0;
}
输入格式:
#a ab ac ad be bf bg ch di ej hk ##
//每个的第一个表示父节点,第二个表示子节点。

猜你喜欢

转载自blog.csdn.net/geek_sun/article/details/80297190