树-孩子表示法

按照定义写的树的存储算法。以及简单的遍历方法。里边用到了广义表的一些算法。建议想要弄懂的去看一下广义表的字符串处理

/*  Author : Moyiii
 *  Mail:  [email protected]
 *  树-孩子表示法实现,只实现了几个简单的功能
 *  复杂功能根据需要可以自己去实现
 *  全部封装会很麻烦
 *  仅作学习之用,当然如果
 *  你想拿去用,随你好啦。
*/
#include<iostream>
#include<queue>
#include<string>
using namespace std;

#define MAX_TREE_DEGREE 100

class TreeNode
{
public:
    char data;
    int degree;
    TreeNode* children[MAX_TREE_DEGREE];
};



class Tree
{
public:
    Tree();
    void input(TreeNode *&node,string s);
    void clear(TreeNode *node);
    void print(TreeNode *node);
    TreeNode *root;
private:
    void getStr(string &pre, string &rest);
};

Tree :: Tree()
{
    root = NULL;
}


void Tree :: clear(TreeNode *node)
{
    if(node == NULL)
    {
        return;
    }
    else
    {

        for(int i = 0; i < node->degree; ++i)
        {
            clear(node->children[i]);
        }
        delete node;
    }
}

//获取rest的第一个子串,rest为逗号后的内容,这个函数来自于广义表
//可以到严书广义表章节中找到这个函数的原型
void Tree :: getStr(string &pre, string &rest)
{
    int count = 0;
    int i = 0;
    while(i < rest.length() && rest[i] != ',' || count != 0)
    {
        if(rest[i] == '(')
        {
            count++;
        }
        else if(rest[i] == ')')
        {
            count--;
        }
        i++;
    }
    pre = rest.substr(0,i);
    if(i != rest.length())
    {
        rest = rest.substr(i+1,rest.length() - i);
    }
    else
    {
        rest = "";
    }
    return;
}

//类似广义表的做法。这就是个广义表其实
void Tree :: input(TreeNode *&node, string s)
{
    node = new TreeNode;
    node->data = s[0];
    if(s.length() == 1)
    {
        node->degree = 0;
        return;
    }
    else
    {
        int num = 0;
        s = s.substr(2,s.length() - 3);
        while(s.length() != 0)
        {
            string pre;
            getStr(pre,s);
            input(node->children[num],pre);
            num++;
        }
        node->degree = num;
    }
}

//层次打印,用的是层次遍历的方法。思路应该很简单
void Tree :: print(TreeNode *node)
{
    if(node == NULL)
    {
        return;
    }
    else
    {
        queue<TreeNode*> q;
        q.push(node);
        while(!q.empty())
        {
            TreeNode *temp = q.front();
            q.pop();
            cout << temp->data << "(";
            for(int i = 0; i < temp->degree; ++i)
            {
                cout << temp->children[i]->data;
                if(i != temp->degree - 1)
                {
                    cout << ",";
                }
            }
            cout << ")";
            cout << endl;
            for(int i = 0; i < temp->degree; ++i)
            {
                q.push(temp->children[i]);
            }
        }
    }
    return;
}

int main()
{
    Tree t;
    string s = "R(A(D,E),B,C(F(G,H,K)))";
    t.input(t.root, s);
    t.print(t.root);
    cout << endl;
    return 0;
}


你可能感兴趣的:(数据结构,树)