在这样的事情中,倒想通常更容易,所以首先考虑一下您的需求。根据您的描述,让我们列出它们:
好的,这是一个很短的列表,应该可以管理。让我们从一个空方法开始,我将添加对应该发生的情况的描述。
valid_bst () {
}
现在有效。您如何检查有效性?在聊天中,您说一棵树是有效的“如果...所有左子项均小于父项,而右子项均大于父项。” 我相信您也打算允许平等。那会是t.left.value <= t.value <= t.right.value
。
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
但是,如果其中一个孩子失踪了怎么办?根据您所说的,我相信您知道如果一个节点丢失(或两个都丢失),该节点仍然有效。让我们添加一下,稍作重组:
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
}
好的,我们现在知道该节点是否有效。我们如何检查整个树是否有效?它不在数组中,因此我们可能无法/不想线性地对其进行循环。您的作业给出了答案:递归。但是,我们如何使用递归来累积答案呢?我们可以访问三个信息,该节点是否有效,以及询问左节点和右节点是否有效的调用结果。显然,只有当这三个都为真时,树才有效。
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
Is the left child valid?
Is the right child valid?
This tree is only valid if this node and both its children are.
}
如果您关注的话,它甚至可以告诉我们函数需要返回什么。
现在,我们如何整合计数?您说什么很重要(“一个具有左右两个子节点的父节点”),这应该不难转换为实际代码。检查是否满足该条件,并适当增加计数器。只要记住,这必须在每次正确的地方都可以实现。
当然,我省略了一些细节,例如递归停止条件并检查是否为null。
<
在节点上如何定义比较运算符?