【发布时间】:2021-01-29 03:54:32
【问题描述】:
struct node{
int data;
struct node*left,*right;
};
node* root; //global root
node* getNode(int item)
{
node* new_node = new node;
new_node->data = item;
new_node->left=new_node->right=NULL;
return new_node;
}
node* insert(node* localroot, int item)
{
if(localroot == NULL){
localroot = getNode(item);
}
else if(item < localroot->data)
localroot->left = insert(localroot->left, item);
else if(item > localroot->data)
localroot->right = insert(localroot->right, item);
root = localroot;
return root; //Why do I have to return root if it is global?
//without this output is wrong
}
void inorder(node* root)
{
if(root != NULL){
inorder(root->left);
std::cout << root->data << ' ';
inorder(root->right);
}
}
void postorder(node* root)
{
if(root != NULL){
postorder(root->left);
postorder(root->right);
std::cout << root->data << ' ';
}
}
int main()
{
insert(root, 15);
insert(root, 9);
insert(root, 2);
insert(root, 1);
insert(root, 4);
insert(root, 18);
std::cout<<"inorder traversal of tree is: ";
inorder(root);
std::cout << "\nPostOrder: ";
postorder(root);
return 0;
}
通常在 main 中,我们将 insert 称为 root = insert(root, 10);(其中 root 在 main() 中声明)。
我想声明 root 全局但插入函数不能为 void 它必须返回 node* 值我可以得到解释。
如果有更好的方法请分享(实际上我想让 insert 成为 void 类型)。
问候,
【问题讨论】:
-
如果你保证你的函数会返回一个
node *,你必须返回一些东西。如果将其返回类型更改为void并省略返回语句,会出现什么错误? -
如果我设置了 void 那么它会显示编译错误
localroot->left = insert(localroot->left, item);这行说“void value not ignored as ought to be”我不会返回 void 这就是我将 root 设为全局的原因。跨度> -
虽然允许对全局变量和局部变量以及函数参数使用相同的名称,但最好避免这样做,因为它会导致难以追踪的错误。尤其是在重构时代码块被移动时;)
标签: c++ recursion insert binary-search-tree function-definition