所以我必须编写一个.dot文件来制作一个已排序的avl树的graphviz图像。方法标题已提供,我必须使用它。
主要问题是当它是std :: string的一部分时,如何正确调用build_dot_content()方法?
void avl::dump_dot(std::string filename){
string s;
ofstream fptr;
fptr.open(filename);
fptr<<"digraph AVL {"<<endl<<"graph [dpi=150];"<<endl<<"nodsep=0.3;"<<endl;
fptr<<"ranksep=0.2;"<<endl<<"margin=0.1"<<endl<<"node [shape = circle fontname=\"Helvetica\"];"<<endl;
fptr<<"edge [arrowsize=0.8]"<<endl<<endl;
stringstream o;
s=string build_dot_content(o, root, 1);
fptr<<s<<endl<<"}"<<endl;
}
std::string build_dot_content(std::stringstream &o, avl_node *e, int i) {
o<<"node"<<i<<" [label =\""<<e->element<<"\"];"<<endl;
int iL = 2*i;
int iR = 2*i+1;
if(e->left != nullptr){
o<<"node"<<i<<" -> node"<<iL<<";"<<endl;
build_dot_content(o, e->left, iL);
}
if(e->right != nullptr){
o<<"node"<<i<<" -> node"<<iR<<";"<<endl;
build_dot_content(o, e->right, iR);
}
string s;
s = o.str();
return s;
}
答案 0 :(得分:0)
您需要将此功能分解为两个;
i
使用根节点从第一个函数调用第二个函数,并在该函数中递归调用自身以流出树。在main函数的末尾,从流生成字符串并将其返回..
- 或者
你的转储函数已经有了一个流,将它与节点和索引一起传递给build_dot_content
函数,这可以递归地流出元素 - 它不应该返回字符串......