我有一个二叉树,在下面的函数中,我使用递归打印出来:
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?
答案 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 );
}
}