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;
}
答案 0 :(得分:2)
进行递归调用时,只是将parent->left
/ parent->right
的指针值传递给被调用的方法,而不是存储此值的位置。因此,当方法执行parent = item
时,它只修改其本地parent
参数变量,而不修改父节点中的原始成员。
要实现您所追求的行为,您必须将parent
声明为Tnode*
的指针或引用。这也将为您带来好处,即head
的处理不再需要单独检查。
编辑:顺便说一下,parent
不是一个好的参数名,因为它实际上并不包含对父节点的引用。