BST方法返回Segfault

时间:2015-01-16 21:49:01

标签: c++ data-structures binary-search-tree

我正在编写一个方法,使用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);
}

3 个答案:

答案 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的定义相冲突。