二叉树"行为"

时间:2016-04-20 16:01:35

标签: c++ binary-tree binary-search-tree

我有以下二进制搜索树(用C ++编写),我对特定的代码行有疑问:

delete k;

如果删除该行,我的代码就可以了,我不明白为什么。 根据我的理解:来自k的数据被插入到树中,然后删除变量k。 为什么数据也会从树中删除?

这是我的代码:

#include <iostream>
using namespace std;
struct nod
{
nod *st=NULL;
int info;
nod *dr=NULL;
int h;
nod *par=NULL;       // par = "father"
};
struct avl     
{
nod *rad=NULL;                  //rad = root;
void insert(nod *z)             //INSERT
{
    nod *y = NULL;
    nod *x = rad;
    while (x != NULL)
    {
        y = x;
        if (z->info < x->info)
        {
            x = x->st;         // st = left
        }
        else
        {
            x = x->dr;        //dr = right
        }
    }
    if (y == NULL)
    {
        rad = z;
    }
    else
    {
        if (z->info < y->info)
        {
            y->st = z;
        }
        else
        {
            y->dr = z;
        }
    }
    z->par = y;
}
void inordine(nod *k)
{
    if (k)
    {
        inordine(k->st);
        cout << k->info<<"\t";
        inordine(k->dr);
    }
}
};
int main(void)
{
avl *arbore = new avl;
int el = 5;
arbore->rad=NULL;
while (el >= 0)
{
    cout << "element\n";
    cin >> el;
        nod *k = new nod;
        k->dr = NULL;
        k->st = NULL;
        k->par = NULL;
        k->info = el;
        arbore->insert(k);
        delete k;
}
cout << "print inordine\n";
arbore->inordine(arbore->rad);


}

1 个答案:

答案 0 :(得分:1)

  

将来自k的数据插入到树中,然后删除变量k

不,k只是一个指针。它指向一个点头(e)。您正在将此节点插入树中(通过将其作为指针传递)。它不是副本,它是同一个节点。 delete不会删除变量,它会删除该节点,因此您也将其从树中删除。

对于你正在使用的原始指针的一个重要论点是,很难表达谁是对象的所有者。这是支持这一论点的证据。您期望树拥有其节点,您的程序显示相反的行为。

要正确处理节点,您需要一个遍历树的析构函数,并在销毁树时删除每个节点。您还需要使用avl::insert(int info, int h);

等插入来隐藏树用户的实际节点