从树结构中获取数据

时间:2014-05-08 20:09:57

标签: c++ data-structures tree

我有一个树结构,我正在创建以下方式。据我所知,树是正确创建的。但是当我想从节点获取数据时,我会得到一些奇怪的acsii符号。

我如何设置数据。让它说空了。此刻无关紧要。我的计划中有价值。该函数自我馈送,直到我到达数据的末尾。

struct Node {
    char Data;
    Node* Left;
    Node* Right;
};

Node maketree(0,s,split)
{
    Node node;
    node.Data=' ';

    Node n1=subsplit(0,s,splitingat);
    Node n2= subsplit(1,splitingat+1,e);
    node.Left=&n1;
    node.Right=&n2;

    return node; 
 }

这就是我从树中获取数据的方式。

char decode(Node node,string text)
{
    int currentindex=0;
    Node sub=node;
    {
    }
    if(text[currentindex]=='0')
    {
        sub=*sub.Left;
        cout<<" x "<<sub.Data<<endl;
    }
    else if(text[currentindex]=='1')
    {
        sub=*sub.Right;
        cout<<" x "<<sub.Data<<endl;
    }

   // cout<<sub.Data<<endl;
}

我认为错误在于我打印的是指针而不是节点。但我不知道我哪里出错了。

1 个答案:

答案 0 :(得分:0)

问题的根源似乎在这里:

Node node;
node.Data=' ';

Node n1=subsplit(0,s,splitingat);
Node n2= subsplit(1,splitingat+1,e);
node.Left=&n1; // danger Will Robinson!
node.Right=&n2;

return node;

您将获取本地,临时,自动变量的地址,并将它们存储在您通过node返回的指针中。只要return执行,n1n2就会被销毁,node.Leftnode.Right会指向垃圾。你可以能够解决这个问题:

Node* n1=new Node(subsplit(0,s,splitingat)); 
Node* n2=new Node(subsplit(1,splitingat+1,e));
// side note: probably better to have subsplit() return dynamically-allocated Node*s to avoid the copy
node.Left=n1;
node.Right=n2;

但如果在其他地方做类似的事情,你可能仍会遇到问题。

沿着相同的行,在第二个代码块中,您正在检查每个节点的副本并将其存储到sub中。将sub设为Node*可能更有意义。

最后,为了完全避免内存管理问题(几乎),请在上述所有内容中使用shared_ptr<Node>代替Node*。 :)