您可以在树上进行深度优先搜索,而无需在单次遍历中缓存每个子树的最小值和最大值,但是您必须小心,因为仅比较父节点和其子节点之间的值是不够的。例如,在以下树中:
(10
(7
nil
(20 nil nil)
)
nil
)
根节点(10)的左子节点(7)满足不等式(7 <= 10),7的右子节点(20)也满足(20 >= 7)。然而,该树不是BST(二叉搜索树),因为20不应该在10的左子树中。
要解决这个问题,您可以进行遍历,并传递额外的参数来指定子树的有效区间。
bool IsBST(const node_t* tree, int lower_bound, int upper_bound) {
if (tree == NULL) return true;
if (tree->value <= lower_bound) return false;
if (tree->value >= upper_bound) return false;
if (!IsBST(tree->left, lower_bound, tree->value))
return false;
if (!IsBST(tree->right, tree->value, upper_bound))
return false;
return true;
}
注意保留原始有效区间,函数将会检测到20在该位置是无效的,因为它不在(7,10)之内。第一次调用应该使用无限区间,例如:
IsBST(tree, INT_MIN, INT_MAX);
希望这能帮到你。
node == node->parent->left
来完成)。 - kbrimington