如何检查给定的BST是否有效?

时间:2018-01-24 09:17:50

标签: java algorithm data-structures tree binary-search-tree

我正在尝试检查给定的二叉树是否是二进制搜索树。我要做的是执行二叉树的顺序遍历,并将当前元素与前一个元素进行比较。如果当前元素更大,我们继续并进一步检查给定树是否无效。

int prev=0;
public int isValidBST(TreeNode A) {
    if(A==null)
    return 1;
    isValidBST(A.left);
  //  System.out.println("val "+A.val);
   if(A.val<=prev)
   return 0;
   // else if(A!=null){
    prev=A.val;

    //System.out.println("prev "+prev);
    isValidBST(A.right);
    if(isValidBST(A.right)==1&&isValidBST(A.left)==1)
    return 1;
    return 0;
}

所以这是我写的代码。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

每个子树只有一个递归调用!使用boolean!

int prev=0;
public boolean isValidBST(TreeNode A) {
    if( A == null ) return true;
    if( ! isValidBST(A.left) ) return false;
    if( A.val <= prev ) return false;
    prev = A.val;
    if( ! isValidBST(A.right) ) return false;
    return true;
}

答案 1 :(得分:1)

  1. 建议:您可以使您的方法返回boolean而不是int。
  2. 另外,我更喜欢采用空节点而不是变量。这样你就可以让你的树存储-ve值而不是整数(只需要改变比较逻辑)。
  3. 如果您希望树也具有非明确值,则可以从node.data <= prev.data

    中删除等号
    TreeNode prev=null;
    public boolean isValidBST(TreeNode node)
    {
        //null is a valid bst
        if(node==null){
            return true;
        }
    
        // traverse the tree in inorder fashion and
        // keep a track of previous node
        if (!isValidBST(node.left)){
            return false;
          }
    
        // compare current data with previous one
       if (prev != null && node.data <= prev.data){
           return false;
       }
    
       prev = node;
    
       //check right subtree
       return isValidBST(node.right);
    }