C++ N叉树的实现
参考:https://www.cnblogs.com/muxuan/p/ntree.html
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
typedef struct MNode {
int data;
vector<MNode*> children;
MNode * parent;
}MNode;
class MTree
{
private:
MNode* root;
public:
void init(MNode* root);
void putChild(MNode * node, MNode* parent);
void putChildren(vector<MNode *>nodes, MNode* parent);
void transversal(MNode * root);
void transversal();
void traval(MNode * root);
};
void MTree::init(MNode *root)
{
this->root = root;
}
void MTree::putChild(MNode* node, MNode * parent)
{
parent->children.push_back(node);
node->parent = parent;
}
void MTree::putChildren(vector<MNode *> nodes, MNode* parent)
{
for (int i = 0; i < nodes.size(); i++)
{
putChild(nodes[i], parent);
}
}
void MTree::transversal()
{
this->transversal(this->root);
}
void MTree::transversal(MNode* root)
//后根遍历
{
vector<MNode*> nodes = root->children;
for (int i = 0; i < nodes.size(); i++)
{
if (nodes[i]->children.size() > 0)
{
transversal(nodes[i]);
}
else
{
cout << nodes[i]->data << ",";
}
}
cout << root->data << ",";
}
void MTree::traval(MNode * root)
//层次遍历
{
if (root == nullptr)
{
return;
}
queue<MNode*> que;
que.push(root);
while (!que.empty())
{
MNode* cur = que.front();
que.pop();
if (cur)
{
for (int i = 0; i < cur->children.size(); i++)
{
que.push(cur->children[i]);
}
}
cout << cur->data << " ";
}
}
int main()
{
MNode node;
MTree tree;
node.parent = nullptr;
node.data = 1;
tree.init(&node);
///test nodes
MNode node2, node3, node4, node5, node6, node7, node8, node9, node10;
node2.data = 2, node3.data = 3, node4.data = 4, node5.data = 5, node6.data = 6;
node7.data = 7, node8.data = 8, node9.data = 9, node10.data = 10;
tree.putChild(&node2, &node), tree.putChild(&node3, &node), tree.putChild(&node4, &node);
tree.putChild(&node5, &node3);
tree.putChild(&node6, &node4), tree.putChild(&node7, &node4);
tree.putChild(&node8, &node5), tree.putChild(&node9, &node5);
tree.putChild(&node10, &node8);
tree.transversal();
cout << endl;
cout << "*****************" << endl;
tree.traval(&node);
system("pause");
return 0;
}