为什么父母>离开不持久

时间:2010-11-29 18:54:42

标签: c++

Bellow是插入二叉树的代码。问题是插入头后,对于第二个输入,函数插入被递归调用,输入为parent-> left或parent-> right,然后它被设置为item。从insert函数返回后,parent-> left或parent-> right(取决于哪种情况)的值保持为NULL,并且没有任何节点分配给head的左侧或右侧。

#include<iostream>
#include<string>

using namespace std;

typedef struct Tnode{
    string word;
    int count;
    Tnode* left;
    Tnode* right;
}; 

static  Tnode *head=NULL ;

Tnode* getNode(string const& iData)
{
    Tnode* pNewNode = new Tnode();
    pNewNode->word = iData;
    pNewNode->count = 0;
    pNewNode->left = NULL;
    pNewNode->right = NULL;
    return pNewNode;
}

void insert_in_tree(Tnode* parent,Tnode *item)
{
    item->count++;
    if ( head== NULL )
    {
        head=item;
        cout<<"Inserting head "<<head->word<<endl;
        return;
    }
    else
    {
        if (item->count==1) parent=head;
        if( parent == NULL )
        { 
            parent=item;
            cout<<"Inserting "<<parent->word<<"count is "<<parent->count<<endl; 
            return;
        }
        else
        {
            if(item->word < parent->word ) 
            {
                insert_in_tree(parent->left,item);
                cout<<"inserted in left of "<<parent->word<<endl;
            }
            else 
            {
                insert_in_tree(parent->right,item);
                cout<<"inserted in right of "<<parent->word<<endl;
            }
        }
   }
}

void print_elements(Tnode *tree)
{
    if(tree!=NULL)
    {
        print_elements(tree->left);
        cout<<tree->word<<endl;
        print_elements(tree->right);
    }
}

int main()
{
    string x;

    while(cin>>x) 
    {
        Tnode * node=getNode(x);
        insert_in_tree(NULL,node);
    }
    if(!cin.eof()) cout<<"Error"<<endl;
    else print_elements(head);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

进行递归调用时,只是将parent->left / parent->right的指针值传递给被调用的方法,而不是存储此值的位置。因此,当方法执行parent = item时,它只修改其本地parent参数变量,而不修改父节点中的原始成员。

要实现您所追求的行为,您必须将parent声明为Tnode*的指针或引用。这也将为您带来好处,即head的处理不再需要单独检查。

编辑:顺便说一下,parent不是一个好的参数名,因为它实际上并不包含对父节点的引用。