在递归函数中抛出错误

时间:2014-03-21 14:06:00

标签: c++ error-handling binary-tree

我有一个二叉树,在下面的函数中,我使用递归打印出来:

void printTree(node *root){
    if(root!=NULL){
        printTree(root->leftSon);
        cout<<root->key<<" ";
        printTree(root->rightSon);
    }
}

它运行正常,但问题是当树空时我无法找到抛出错误的方法。我试图通过添加另一个if语句来解决这个问题:

void printTree(node *root) throw(runtime_error){
    if(root==NULL) {
        throw runtime_error("Tree is empty");
    }

    if(root!=NULL){
        printTree(root->leftSon);
        cout<<root->key<<" ";
        printTree(root->rightSon);
    }
}

但是再一次,当root到达树的末尾时,root总是被设置为NULL,所以这个函数总是会抛出一个错误。 在首次调用函数时,如何设置条件以检查root是否为NULL?

3 个答案:

答案 0 :(得分:4)

您可以通过多种方式完成所要求的工作。其中之一是:

static void printTree_implementation(node *root) {
    ... do whatever you're already doing without the exception
}

void printTree(node *root) throw(runtime_error){
    if(root==NULL) {
        throw runtime_error("Tree is empty");
    }
    printTree_implementation(root);
}

目的是printTree_implementation()只能 {<1>}来调用printTree(),因此您知道您已经在实施外部管理了错误检查。通过使实现静态,您可以限制函数的调用方式。

如果您是通过课程解决这个问题,那么您可以将实施方法设为private方法。

答案 1 :(得分:0)

可能还有其他一些方法,但我想到的是你可以通过一些反变量,如

void printTree(node *root,int counter=0)
{
      if(counter==0 && root==NULL)
      {
          throw runtime_error("Tree is empty");
      }

      //some other operation
      printTree(root->rightSon,counter++);
}

答案 2 :(得分:-1)

有几种方法可以做到这一点。也许你可以尝试这样的事情: (不确定这是否是最佳方式)

void printTree(node *root)
{
    static int index = 0;

    if( 0 == index && !root ) 
    {
        throw runtime_error( "Tree is empty" );
    }

    index++;

    if( root )
    {
        printTree( root->leftSon );
        cout << root->key << " ";
        printTree( root->rightSon );
    }
}