我正在编写一个方法,使用inorder遍历方法检查给定的树是否是BST。在执行此方法时,我得到一个段错误。有人可以帮我纠正吗?
这里,最大值存储BST中的最大值,并且k被初始化为0.假设BST具有唯一的正值。 isNull(root)检查当前节点是否为空节点。
bool check(BstNode* root)
{
if (root->data==maximum) return true;
isNull(root);
check(root->left);
if (root->data>k)
{
k=root->data;
}
else
{
return false;
}
check(root->right);
}
答案 0 :(得分:0)
每次调用check(root-> left)并检查(root-> right)时,我想你需要添加sth来确定左边和右边的分支是否为null。在你的代码中,你只是假设在左右分支中有sth并调用check函数。我认为这是主要原因。
答案 1 :(得分:0)
您不需要指定最大值。 An elegant solution can be found here
答案 2 :(得分:0)
有两种方法可以做到这一点。
一种是自上而下的方法,首先检查当前节点是否有效,如果是,则检查两个子树。这非常直观。你可以从@lerman's post找到代码:
struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
};
bool isBST(TreeNode *node, int minData, int maxData) {
if(node == NULL) return true;
if(node->data < minData || node->data > maxData) return false;
return isBST(node->left, minData, node->data) && isBST(node->right, node->data, maxData);
}
if(isBST(root, INT_MIN, INT_MAX)) {
puts("This is a BST.");
} else {
puts("This is NOT a BST!");
}
另一种方式是自下而上的方法:首先检查左子节点然后检查右子节点并最后检查当前树。下面是这种方法的代码。
bool isValidBST(TreeNode *root) {
int mmin, mmax;
return helper(root, mmin, mmax);
}
bool helper(TreeNode* root, int& mmin, int& mmax) {
if(!root) {
mmin = INT_MAX;
mmax = INT_MIN;
return true;
}
int leftmin, leftmax, rightmin, rightmax;
if(!helper(root->left, leftmin, leftmax))
return false;
if(!helper(root->right, rightmin, rightmax))
return false;
if(root->val > leftmax && root->val < rightmin) {
mmin = min(min(leftmin, rightmin), root->val);
mmax = max(max(leftmax, rightmax), root->val);
return true;
}
else
return false;
}
您可能会注意到第一种方法是预订单遍历,第二种方法是后序遍历。 inorder遍历不合适,因为它与BST的定义相冲突。