以下是查找给定二进制树是否为二叉搜索树(BST)的代码:
bool isBST(struct node* root)
{
// traverse the tree in inorder fashion and keep track of prev node
if (root)
{
struct node *prev = NULL;
if (!isBST(root->left))
return false;
// Allows only distinct valued nodes
if (prev != NULL && root->data <= prev->data)
return false;
prev = root;
return isBST(root->right);
}
return true;
}
然而,这并没有给出正确的输出。 当我将代码更改为以下版本时,它运行良好:
bool isbst(node * root)
{
static struct node * prev = NULL;
if( root)
{
if(!isbst(root->left))
return false;
if(prev != NULL && root->data < prev->data)
return false;
prev = root;
return isbst(root-> right);
}
return true;
}
我的问题是,当代码中添加了行static struct node * prev = NULL;
时,为什么会有效?
在我以前的代码中,即使变量'prev'被一次又一次地声明,每次都更新到root ..我的代码应该运行正常。但事实并非如此。这有什么问题?
答案 0 :(得分:1)
static struct node * prev = NULL;
在上面一行中,使用 static 关键字会产生两件事: 1) prev 仅被初始化为零一次,即第一次到达时 2)更重要的是,因为 prev 是静态的,所以在对函数 isBST 的后续调用中会保留对其值的任何更新。
在没有静态关键字
的初始/错误/不工作的情况下struct node *prev = NULL;
1)你没有保留前一个节点的价值(这正是你的算法没有工作的原因) 2)您不仅要将其设置为空
简而言之,通过使用静态,您保留了上一个节点的值(您的意图)。在另一种情况下,您不能保留上一个节点的值
C ++中函数作用域内变量的静态初始化是在递归调用之间保留值的一种巧妙方法。