我正在阅读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;
你能用另一种方式重写吗?
由于
答案 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;
}
希望这会有所帮助: - )。