树-孩子表示法
来源:互联网 发布: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
- 树-孩子表示法
- C++ 树-双亲表示法、孩子表示法、双亲孩子表示法
- 构建树(孩子兄弟表示法)
- 树的孩子兄弟表示法
- 孩子兄弟表示法实现树
- 树的孩子兄弟表示法
- VC++ 树的孩子兄弟表示法
- 数据结构:树--孩子兄弟表示法
- 二叉树--兄弟孩子表示法
- 树的双亲孩子表示法
- 树 的 双亲表示法 及 双亲孩子表示法
- 括号表示转孩子数组表示法
- 一般的树的创建,兄弟孩子表示法
- 使用C++ 和 孩子兄弟表示法实现树
- 树的孩子兄弟表示法 及遍历实现
- 数据结构——树的孩子表示法
- 树的孩子表示法(指针形式)
- 第六章(5).树的孩子兄弟表示法
- TIOBE 和 PyPI 两大编程语言排行榜哪个更靠谱
- The sum problem 2058
- Android网络编程之——Android下菜单系统模块的实现(Android客户端+服务器端Servlet+Mysql)
- opencv中cvFilter2D( ) 函数filter2D()函数与MATLAB中imfilter()函数的差异
- 二维数组地址的关系
- 树-孩子表示法
- Android ContentProvider实例
- android中常用的查询、插入、更新、删除等SQL语句以及SQLite数据类型
- sata下装xp
- JSON ,map,list.xml相互转换
- ndk no rule to make target
- Android网络编程之一个Android下菜单系统模块的实现(开桌功能))(Android客户端+服务器端Servlet+Mysql)
- HDU-4464-Browsing History (2012 ACM/ICPC成都现场赛!)
- 多继承指针转化的问题