前几天觉得STL中没有树和图真是一种莫大的遗憾啊,但是在网上搜了搜,发现其实可以用容器很简单的构造树。
还是废话少说上代码:
struct TreeNode{ DataType data; // DataType define int vector<TreeNode> children;}就这么简单就可以构造树的节点。
然后我们可以简单的造一颗树
那么我们可以写个CreateTree来创建
void CreateTree(vector<TreeNode>::iterator root){ if (root->data < 1) return; TreeNode *NewNode; for (int i=1;i<=3;i++) { NewNode = new(TreeNode); NewNode->data = root->data - 1; root->children.push_back(*NewNode); delete NewNode; } for (vector<TreeNode>::iterator it=root->children.begin(); it!=root->children.end(); it++) CreateTree(it);}
当然构造了树在内存中又看不到,所以还得写个dfs输出。
void dfs(vector<TreeNode>::iterator root){ std::cout<<" "<<root->data; if (root->children.empty()) return; for (vector<TreeNode>::iterator it=root->children.begin(); it!=root->children.end(); it++) dfs(it);}
有了树后添加节点神马的就很简单啦
void AddNewNode(vector<TreeNode>::iterator root, DataType d){ TreeNode *NewNode; NewNode = new(TreeNode); NewNode->data = d; root->children.push_back(*NewNode); delete(NewNode);}
可能有点同学会好奇为神马new了个新的空间后还要delete掉,这是因为所有的STL函数都是实参传形参会将new的空间拷贝一份。为了既然拷贝了那我原来new的那一份空间就没用了,就delete掉了呗。
同样有了树后弄个动态的的图神马的也不是难事。
比如:
vector< vector<DataType> > g0;
当然大家可以类推,像神马
vector< list<int> > g1;list< list<int> > g2;
然后发现link有个很有用的方法list.unique();可以将同样的元素去掉,大家用的时候注意啊,某些特定的时候会很方便的。当然有各种set也是集合性质的,但set的貌似是高度的二插平衡树。要用到线性的时候还得用list。
以上就是这两天来的学习记录………………
睡觉去了
该文转自http://www.cnblogs.com/gy725/archive/2011/09/28/2194808.html
转载于:https://www.cnblogs.com/yzm10/p/7228831.html
