树-孩子表示法

来源:互联网 发布:java 处理undefined 编辑:程序博客网 时间:2024/04/27 16:52

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

/*  Author : Moyiii *  Mail:  lc09@vip.qq.com *  树-孩子表示法实现,只实现了几个简单的功能 *  复杂功能根据需要可以自己去实现 *  全部封装会很麻烦 *  仅作学习之用,当然如果 *  你想拿去用,随你好啦。*/#include<iostream>#include<queue>#include<string>using namespace std;#define MAX_TREE_DEGREE 100class 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;}


0 0