替代布尔递归

时间:2015-04-11 20:32:37

标签: java recursion boolean binary-tree binary-search-tree

我似乎无法想出解决这个问题的方法。至少不是一种优雅的方式。该函数应确定给定树是否为二叉搜索树。它似乎有效(现在不允许重复)。

这是函数开始的地方:

isBinarySearchTree(root)

功能:

public static boolean isBinarySearchTree(Node node) {

    if (node.leftchild != null) {
        if (node.leftchild.key < node.key)
            isBinarySearchTree(node.leftchild);
        else {
            System.out.println("false: " + node + " -> " + node.leftchild);
            return false;
        }
    }

    if (node.rightchild != null) {
        if (node.rightchild.key > node.key)
            isBinarySearchTree(node.rightchild);
        else {
            System.out.println("false: " + node + " -> " + node.rightchild);
            return false;
        }
    }

    return true;
}

显然我想要回归的方式有问题。如果所有布尔返回值都在逻辑&&链中,这将起作用。如果所有返回值都为真,则返回值应仅为true

我怎么能重写这个功能呢?或者甚至可能吗?

3 个答案:

答案 0 :(得分:1)

这应该有用,我想:

public static boolean isBinarySearchTree(Node node, int key) {
    if (node.leftchild != null && node.leftchild.key < key || node.rightchild != null && node.rightchild.key > key) {
        return false;
    } else {
        return (node.leftchild != null ? isBinarySearchTree(node.leftchild, node.leftchild.key) : true) && (node.rightchild != null ? isBinarySearchTree(node.rightchild, node.rightchild.key) : true);
    }
}

答案 1 :(得分:0)

您需要在逻辑上将测试结果在左侧并在右侧进行测试,然后返回结果,例如return (leftnode == null || (leftnode.key < key && isBinarySearchTree(leftnode))) && (rightnode == null || (key < rightnode.key && isBinarySearchTree(rightnode)));。不过,把它分成几行可能会更清楚。

答案 2 :(得分:0)

        public static boolean isBinarySearchTree(Node node) {

         if(node==null)
            return false;
         if(node.left!=null &&node.key <node.left||node.right!=null &&node.key >node.right)
        return false;
    if((getMax(node.left)>getMin(node.right)) //Left subtree should not have a value which larger than min in right subtree
     return false;
//check recurisvely left and right subtrees
     if(!(isBinarySearchTree(node.left)&&isBinarySearchTree(node.right)))
     return false;

     return true;