【问题标题】:Alternative to boolean recursion布尔递归的替代方案
【发布时间】:2015-06-17 10:20:33
【问题描述】:

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

这是函数开始的地方:

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;
}

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

我将如何重写函数才能这样工作?还是有可能?

【问题讨论】:

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


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要对左侧的测试结果和右侧的测试结果进行逻辑与运算,然后返回结果,例如 return (leftnode == null || (leftnode.key &lt; key &amp;&amp; isBinarySearchTree(leftnode))) &amp;&amp; (rightnode == null || (key &lt; rightnode.key &amp;&amp; isBinarySearchTree(rightnode)));。不过,将其分成几行可能会更清楚。

      【讨论】:

        【解决方案3】:
                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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 2020-03-09
          • 1970-01-01
          相关资源
          最近更新 更多