-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtree.cpp
More file actions
103 lines (91 loc) · 2.93 KB
/
Copy pathtree.cpp
File metadata and controls
103 lines (91 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "tree.h"
// 生成GML文件中节点的部分
void TreeNode::generateNodeGML(std::ofstream& outfile) {
// 写入节点的开始标记和ID到输出文件中
outfile << " node" << std::endl;
outfile << " [" << std::endl;
outfile << " id " << id << std::endl;
outfile << " ]" << std::endl;
// 递归处理每个子节点
for (TreeNode* child : children) {
child->generateNodeGML(outfile);
}
}
// 生成GML文件中边的部分
void TreeNode::generateEdgeGML(std::ofstream& outfile)
{
// 遍历当前节点的每个子节点
for (TreeNode* child : children) {
// 写入边的开始标记以及源节点和目标节点到输出文件中
outfile << " edge" << std::endl;
outfile << " [" << std::endl;
outfile << " source " << id << std::endl;
outfile << " target " << child->id << std::endl;
outfile << " ]" << std::endl;
// 递归处理当前子节点的子节点
child->generateEdgeGML(outfile);
}
}
// 将GmlTree转换为GML格式文件
void TreeNode::Convert_GmlTree_To_GML() {
// 打开文件以写入GML数据
std::ofstream outfile("tree.gml");
if (outfile.is_open()) {
// 写入GML文件的头部信息,包括图的类型
outfile << "graph" << std::endl;
outfile << "[" << std::endl;
outfile << " directed 0" << std::endl;
// 生成GML文件中节点的部分
generateNodeGML(outfile);
// 生成GML文件中边的部分
generateEdgeGML(outfile);
// 写入GML文件的尾部信息,关闭文件
outfile << "]" << std::endl;
outfile.close();
}
else {
// 如果文件打开失败,则输出错误消息
std::cerr << "Unable to open file for writing." << std::endl;
}
}
// 插入节点方法,根据父节点标识符和新节点标识符插入新节点
void Tree::insert(int parentId, int Id) {
// 如果根节点为空,且父节点标识符为-1,则创建根节点
if (root == nullptr) {
if (parentId == -1) {
root = new TreeNode(Id);
}
return;
}
// 递归插入新节点
insertRec(root, parentId, Id);
}
// 递归插入节点方法
void Tree::insertRec(TreeNode* node, int parentId, int Id) {
// 如果当前节点的标识符等于父节点标识符,则将新节点添加为当前节点的子节点
if (node->id == parentId) {
node->children.push_back(new TreeNode(Id));
}
else {
// 否则递归查找子节点并插入新节点
for (TreeNode* child : node->children) {
insertRec(child, parentId, Id);
}
}
}
// 打印树方法,从指定节点开始递归打印树的结构
void Tree::printTree(TreeNode* node) {
if (node == nullptr) {
return;
}
// 打印当前节点的标识符以及其所有子节点的标识符
std::cout << node->id << ": ";
for (TreeNode* child : node->children) {
std::cout << child->id << " ";
}
std::cout << std::endl;
// 递归打印每个子节点的树结构
for (TreeNode* child : node->children) {
printTree(child);
}
}