c+中带列表的树数据结构+; 我在C++中实现了一个树形结构,参照了别人的代码。下面我编写的代码肯定是经过编译的,而且似乎工作得很好。但我怀疑还有更好的方法。例如,这段代码在内存泄漏时是否安全?有没有更简单、计算效率更高的方法
具体来说,我怀疑“std::list lst_节点”的必要性。 树类中的expand_node函数将新节点附加到父节点,该父节点的值与新节点的值最接近。此过程需要对所有现有节点进行迭代以访问其值。为了这个迭代,我在树类中定义了一个名为“std::list lst_nodes”的成员变量。我怀疑可能存在一种不定义lst_节点也能做到这一点的简洁方法c+中带列表的树数据结构+; 我在C++中实现了一个树形结构,参照了别人的代码。下面我编写的代码肯定是经过编译的,而且似乎工作得很好。但我怀疑还有更好的方法。例如,这段代码在内存泄漏时是否安全?有没有更简单、计算效率更高的方法,c++,list,tree,self-reference,C++,List,Tree,Self Reference,具体来说,我怀疑“std::list lst_节点”的必要性。 树类中的expand_node函数将新节点附加到父节点,该父节点的值与新节点的值最接近。此过程需要对所有现有节点进行迭代以访问其值。为了这个迭代,我在树类中定义了一个名为“std::list lst_nodes”的成员变量。我怀疑可能存在一种不定义lst_节点也能做到这一点的简洁方法 #include<random> #include<iostream> #include<list> using
#include<random>
#include<iostream>
#include<list>
using namespace std;
class Node{
public:/*functions*/
Node(const double& val_, Node* parent_=nullptr)
:val(val_), parent(parent_)
{
if(parent){
parent->children.push_back(this);
}
}
public:/*variables*/
Node* parent;
std::list<Node*> children;
double val;
};
class Tree{
public:/*function*/
Tree(double x_init);
void extend_node();
public:/*variables*/
list<Node*> lst_nodes;
double x_init;
};
Tree::Tree(double x_init_)
:x_init(x_init_)
{
Node* n=new Node(x_init);
lst_nodes.push_back(n);
}
void Tree::extend_node(){
double val_new = rand();
auto it=lst_nodes.begin();
double minval = abs((**it).val-val_new);
Node* node_parent;
for(;it!=lst_nodes.end(); it++){
if(minval>abs((**it).val-val_new)){
minval = abs((**it).val-val_new);
node_parent = *it;
}
}
Node* n_new = new Node(val_new, node_parent);
node_parent->children.push_back(n_new);
lst_nodes.push_back(n_new);
}
int main(){
Tree t(0);
for(int i=0; i<100; i++){
t.extend_node();
}
}
#包括
#包括
#包括
使用名称空间std;
类节点{
公共:/*功能*/
节点(const double&val,节点*父节点=nullptr)
:val(val_)、父(parent_)
{
如果(家长){
父->子对象。向后推(此);
}
}
公共:/*变量*/
节点*父节点;
性病:列出儿童;
双val;
};
类树{
公共:/*功能*/
树(双x_init);
void extend_node();
公共:/*变量*/
列出lst_节点;
双x_初始;
};
Tree::Tree(双x_init_)
:x_init(x_init)
{
Node*n=新节点(x_init);
lst_节点。向后推_(n);
}
void树::扩展_节点(){
double val_new=rand();
auto it=lst_节点。begin();
双最小值=绝对值(**it.val-val_新);
节点*节点\父节点;
对于(;it!=lst_nodes.end();it++){
如果(minval>abs((**it.val-val\u new)){
minval=abs(**it.val-val_新);
node_parent=*it;
}
}
Node*n_new=新节点(val_new,Node_parent);
节点\u父节点->子节点。推回(n\u新建);
lst_节点。将_向后推(n_新建);
}
int main(){
树t(0);
在现代C++中,(int i=0;i,可以使用<代码> UNQuyJORION 而不是原始的<代码> T*< /Cord>指针,当指向的对象是拥有指针的对象所拥有的。这样,您就不必明了<代码>删除<代码>对象,它将在<代码> UNQuyGyPTR < /C>析构函数> < /P>
在树(即一个没有圈的连通图)中,所有权是明确定义的:每个节点都拥有它的子节点,因此您可以使用列表作为节点::子节点您可以在as上发布well@Richard:您的链接未按预期显示,因为您忽略了“https://”这段代码在内存泄漏的情况下安全吗?--没有一个调用delete
,因此代码充满了内存泄漏。@Beta fixed Thanks您是正确的,lst_节点不应该在那里。您正在创建一个节点列表和一个树。相反,将其设置为搜索树,以便您可以通过这种方式定位节点。