是否应指定退货条件?

时间:2015-06-16 04:33:58

标签: c++ tree binary-tree

这些函数会提供相同的输出,它们都是正确的,但我想知道哪种编程更合适?

代码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;
};

2 个答案:

答案 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)

关于代码可读性 - 对于这种情况,第一个代码是好的

  1. 如果您检查NULL&amp;立即返回你不需要为其他代码添加大括号,因为你知道它不是NULL。不需要显式写 else 。直接使用指针。
  2. 与第二代码相比,第一代码的括号更少。检查指针的嵌套块越少,即如果有效则执行某些操作,再次检查指针是否执行某些操作等等。
  3. 关于使用的数据 - 对于这种情况,第二个代码是好的。

    1. 我首先要说的是,永远不会传递错误的输入/参数。在此 case NULL。总是要确保传递正确的输入。

    2. 如你所知,你永远不会传递NULL,我会说 检查数据是否正确&amp;进一步操纵 它。 如果 声明来到此处。您可能需要进行多项检查,从而导致 嵌套块 与in。

    3. 这就是说,这两种编码风格并不总是适用于所有代码。取决于逻辑&amp;两者的需要可以互换使用。