如何在二叉搜索树中查找节点

时间:2016-10-31 10:56:24

标签: java

我正在阅读java中的二叉树。我找到了这段代码:

public BSTNode findNode(Comparable val){
        int delta = val.compareTo(value);
        // the value is less than this.value
        if(delta < 0){
            // if there is a leftChild, return left.findNode(val)
            // there is no leftChild, so the val does not exist
            // in the node, so return null
            return (left!= null)? left.findNode(val): null;
        }
        // else if the value is greater than this.value
        else if (delta > 0){
            // if there is a rightChild, then return right.findNode(val)
            // else, there is no rightChild, return null
            return (right != null)? right.findNode(val): null;
        }
        // else, dela == 0, so we have found the node with that
        // val, return the node
        return this;
    }

我不明白这是如何运作的:

return (left!= null)? left.findNode(val): null;
return (right != null)? right.findNode(val): null;

你能用另一种方式重写吗?

由于

2 个答案:

答案 0 :(得分:1)

好的,我们一步一步走。首先,我将专注于算法本身。

class Node<T> {
    T value;
    Node left;
    Node right;
}

您可以保证left的所有值都小于或等于value,并且right的所有值都大于或等于value。这使搜索更容易。如果您要查找元素val,只需将其与当前value中的Node进行比较即可。如果所需的元素是相等的当前元素,那么你已经找到了它。如果它更大,它只能在树的正确部分。否则在左侧。

元素不在这里可能会发生。如果您发现它应该位于当前节点的左/右,但是那里没有任何内容(null)。

所以BinaryTreeSearch是:

T search(Node tree, T val) {
    int delta = tree.getValue.compareTo(val);
    if (delta == 0) {
        return tree.getValue;
    } else if (delta > 0) {
        return search(tree.getRight(), val);
    } else {
        return search(tree.getLeft(), val);
    }
}

但等等......如果项目不在这里,这会导致NPE。 我们来修改它:

T search(Node tree, T val) {
    if (tree == null)
         return null;
    int delta = tree.getValue.compareTo(val);
    if (delta == 0) {
        return tree.getValue;
    } else if (delta > 0) {
        return search(tree.getRight(), val);
    } else {
        return search(tree.getLeft(), val);
    }
}

这也可以这样重写:

T search(Node tree, T val) {
    int delta = tree.getValue.compareTo(val);
    if (delta == 0) {
        return tree.getValue;
    } else if (delta > 0) {
        if (tree.getRight() == null) 
            return null;
        return search(tree.getRight(), val);
    } else {
        if (tree.getLeft() == null)
            return null;
        return search(tree.getLeft(), val);
    }
}

但是这里有三元运算符,它被缩短并简化为if-else

result = testCondition ? value1 : value2

相同
if (testCondition) {
    result = value1;
} else {
    result = value2;
}
  

另一个条件运算符是?:,它可以被认为是if-then-else语句的简写(在本课程的控制流语句部分中讨论)。此运算符也称为三元运算符,因为它使用三个操作数。在下面的示例中,此运算符应读作:“如果someCondition为true,则将value1的值赋给result。否则,将value2的值赋给result。”

所以我们终于收到了:

T search(Node tree, T val) {
    int delta = tree.getValue.compareTo(val);
    if (delta == 0) {
        return tree.getValue;
    } else if (delta > 0) {
        return (tree.getRight() == null) ? null : search(tree.getRight(), val);
    } else {
        return (tree.getLeft() == null) ? null : search(tree.getLeft(), val);
    }
}

答案 1 :(得分:0)

他们可以改写为:

select UserId
from your_table
where DateAdded >= '2016-01-01' 
  and DateAdded <= '2016-06-01'
and ID not in
(
   select min(ID) from your_table group by userId
)
group by UserId
having count(*) >= 2

if(left != null) {
  return left.findNode(val);
} else {
  return null;
}

希望这会有所帮助: - )。