检查二叉树是否是 BST
Checking if binary tree is a BST
我被下面的算法搞糊涂了:
public static boolean checkBST(TreeNode n) {
if (n == null) {
return true;
}
// Check / recurse left
if (!checkBST(n.left)) {
return false;
}
// Check current
if (last_printed != null && n.data <= last_printed) {
return false;
}
last_printed = n.data;
// Check / recurse right
if (!checkBST(n.right)) {
return false;
}
return true;
}
我了解 in-order 遍历,并了解比较当前节点的左侧 child 以确保它 <= 与 [=16= 行中的 parent ] <= last_printed,但是在这个递归中我们在哪里检查右边的 child 是否大于 parent?
你的左方法和右方法是做什么的?你只是想验证你有一个二叉搜索树吗?
右侧 child 的检查方式和位置与左侧 child 相同。
该算法的工作原理就好像是通过 in-order 遍历打印每个节点的值,然后检查结果列表是否有序。然而,它并没有实际打印,而是在实例变量 last_printed
中维护 本应 在遍历的那个点上最近打印的值。无论遍历的进展和到当前节点的路径如何,标记为 // Check current
的测试都会正确测试当前节点是否按照与作为 BST 的树一致的顺序遍历。
需要注意的关键可能是 last_printed
在遍历当前节点时更新,在遍历左子树和右子树之间。
我被下面的算法搞糊涂了:
public static boolean checkBST(TreeNode n) {
if (n == null) {
return true;
}
// Check / recurse left
if (!checkBST(n.left)) {
return false;
}
// Check current
if (last_printed != null && n.data <= last_printed) {
return false;
}
last_printed = n.data;
// Check / recurse right
if (!checkBST(n.right)) {
return false;
}
return true;
}
我了解 in-order 遍历,并了解比较当前节点的左侧 child 以确保它 <= 与 [=16= 行中的 parent ] <= last_printed,但是在这个递归中我们在哪里检查右边的 child 是否大于 parent?
你的左方法和右方法是做什么的?你只是想验证你有一个二叉搜索树吗?
右侧 child 的检查方式和位置与左侧 child 相同。
该算法的工作原理就好像是通过 in-order 遍历打印每个节点的值,然后检查结果列表是否有序。然而,它并没有实际打印,而是在实例变量 last_printed
中维护 本应 在遍历的那个点上最近打印的值。无论遍历的进展和到当前节点的路径如何,标记为 // Check current
的测试都会正确测试当前节点是否按照与作为 BST 的树一致的顺序遍历。
需要注意的关键可能是 last_printed
在遍历当前节点时更新,在遍历左子树和右子树之间。