这些函数会提供相同的输出,它们都是正确的,但我想知道哪种编程更合适?
代码1:
void inorder(node *t){
if(t==NULL)
return;
else{
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
return;
}
}
代码2:
void inorder(node *t){
if(t){
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
}
}
此节点是二叉树的节点,具有以下结构:
struct node{
int data;
node *left;
node *right;
};
答案 0 :(得分:2)
第二个看起来更好。
但是,我个人更喜欢这个:
void inorder(node * t){
if(t==NULL)
return;
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
}
它是显式(如果t
为NULL,你不打算做任何事情)和通过删除else来避免不必要的阻塞(从而缩进) 。这种方法还提高了可读性,使代码简洁(认为更大的功能和/或块,并删除不必要的 else )。
我可能会重构这个函数,将其作为两个:
//Use const wherever possible!
void inorder(std::ostream & out, node const * t){
if(t==NULL)
return;
inorder(out, t->left);
out<<t->data<<" "; //write to any output stream
inorder(out, t->right);
}
void inorder(node const * t){
inorder(std::cout, t); //write to stdout
}
这样,如果使用第一个函数,甚至可以将树打印到文件中,如下:
std::ofstream file("inorder.txt");
inorder(file, tree);
希望有所帮助。
答案 1 :(得分:0)
关于代码可读性 - 对于这种情况,第一个代码是好的
关于使用的数据 - 对于这种情况,第二个代码是好的。
我首先要说的是,永远不会传递错误的输入/参数。在此 case NULL。总是要确保传递正确的输入。
如你所知,你永远不会传递NULL,我会说 检查数据是否正确&amp;进一步操纵 它。 如果 声明来到此处。您可能需要进行多项检查,从而导致 嵌套块 与in。
这就是说,这两种编码风格并不总是适用于所有代码。取决于逻辑&amp;两者的需要可以互换使用。